“CPU usage” e “load average”

Usuários novatos do Linux confundem essas duas medidas. Afinal, no Windows, só a primeira é informada no Task Manager… CPU Usage corresponde não ao uso da CPU, mas ao percentual do processamento que não está sendo feito pelo kernel. Ou, melhor, é a medida de quanto o task scheduler não está controlando o chaveamento de tarefas. É por isso que uma aplicação “em loop” costuma causar 100% “de uso” de CPU. O processamento está 100% nas mãos da aplicação, não no scheduler. É claro que isso tem a consequência de tornar o ambiente gráfico menos “responsivo”…

Ao ver a barrinha da CPU no task manager subindo o usuário do Windows deveria pensar: “O Windows não está tendo chance de chavear as tarefas!”, mas nunca pensar: “A CPU tá executando à carga máxima”… Afinal, a CPU sempre está executando à carga máxima… A CPU não pára (a não ser quando algum dispositivo requisite os barramentos para realizar DMA – mas, mesmo isso é pouco frequente, graças aos chipsets — e, não, interrupções e exceções não contam, já que não “interrompem”, de fato, a CPU).

O que o Linux (e, acredito, outras variações do Unix) nos dá, além do percentual de “uso” é a carga média (load average). Essa medida é melhor entendida se usarmos a analogia do trânsito automotivo. Imagine uma avenida com carros enfileirados. Cada carro pode ou não estar funcionando com carga máxima (à máxima velocidade), mas o que interessa mesmo é se o trânsito está fluindo, se não há espera, como no caso de um semáforo…

O “load average” nos diz isso… Se o sistema tiver uma CPU com apenas um core, a carga máxima, sem “enfileiramento” de tarefas, deve ser 1. Com duas CPUs (ou 2 cores), no máximo 2, e assim por diante. Se tivermos apenas uma CPU e o load average for maior que 1, isso significa que existem tarefas numa fila de espera. Há um “congestionamento” de tarefas. A figura abaixo ilustra o ponto:

Os carrinhos azuis são as tarefas... fácil, né?

Repare que se o load average é 1.7, sete tarefas ficam “em espera” quanto as outras 10 estão “fluindo”. No fluxo, quando o load average é 1.0, note que todas as tarefas são executadas e nenhuma é colocada em espera. E, no primeiro caso, existe tempo de sobra para execução de outras tarefas…

Existem 3 medidas de load average. Uma de minuto em minuto, outra de 5 em 5 minutos e ainda outra de 15 em 15 minutos. Os utilitários top e uptime te informarão esses valores:

 $ uptime
 18:43:47 up 2 days,  7:10,  1 user,  load average: 0.78, 0.28, 0.13

No meu exemplo, às 18:43:47, meu sistema está up a 2 dias e 7 horas. e as médias de carga de 1 minuto, 5 minutos e 15 minutos são, respectivamente 0.78, 0.28 e 0.13. Acontece que meu computador é um quad core. Isso significa que minhas avenidas têm 4 vias. A carga máxima de minha CPU poderá chegar até 4 sem “gargalos” no “trânsito” das tarefas.

Um valor ideal, empírico, para um servidor, é manter as médias de carga, no máximo, em torno de 70% do total de CPUs (ou cores). Isso deixa as CPU com 30% de liberadade para executar tarefas do kernel, por exemplo. Meu load average máximo (no quad core) poderia chegar, de forma ideal, até a 2.8.

5 comentários sobre ““CPU usage” e “load average”

  1. Muito bom! Só uma dúvida… e quanto ao clock da CPU? Tenho em meu servidor ubuntu (usado para sites simples e blogs) a possibilidade de configurar 10 vCPU de 2000mhz ou 20vCPU de 1000mhz. Com 20 vCPU terei 20 vias, não é isso?

    1. O clock não é importante, neste caso, a média de carga mede a carga, ou seja, se o sistema está ou não serializando threads.
      Ainda, tenha em mente que isso é bem válido com relação a devices físicos… 20 processadores físicos te proporcionarão uma média de carga limite de 14 (empírico), enquanto 10, 7…

      Como a VM serializará as threads é outro assunto completamente diferente.

  2. Esta filosofia é antiga, os kernel mudaram, não se faz mais o calculo desta forma. Não é um pra um. Temos processos que ficam dormindo que podem provocar isso e não significa que 2 de carga para dual processador está ruim.
    Com o passar do tempo, nos kernel mais novos, também foram adicionados no cálculo do LA os processos com status de uninterruptible sleep, que são os processos que estão aguardando algum tipo de I/O (seja de disco, rede, memória, etc).
    Neste momento o LA deixou de ser apenas uma medida da “demanda de CPU” e passou a ser mais uma medida de “demanda do sistema“. Pois se vários processos estiverem aguardando disco ou memória ou rede ou CPU, o load terá um valor alto.

Deixe um comentário