Compreendendo o comprimento da fila de execução da CPU no Linux

O sistema operacional Linux usa processos para executar todas as tarefas do sistema e do usuário. Esses processos podem estar bloqueados, eliminados, em execução ou aguardando para serem executados. O número de processos nos dois últimos estados determina o comprimento da fila de execução da CPU.

Existem vários estados de processo possíveis, como:

  • Executável ou em execução
  • Suspensão interrompível
  • Suspensão ininterrupta
  • Parada
  • Zumbi

Os processos que aguardam recursos ou sinais de outras funções estarão no estado de suspensão interrompível ou ininterruptível: o processo é colocado em suspensão até que os recursos de que necessita estejam disponíveis. Então, dependendo do tipo de suspensão, o processo pode passar para um estado executável ou permanecer em suspensão.

Mesmo quando um processo tem todos os recursos necessários, ele não começa a ser executado imediatamente. Ele faz a transição para o estado executável, onde é enfileirado junto com outros processos no mesmo estado. A CPU pode executar esses processos nos próximos segundos ou milissegundos. O escalonador alinha processos para a CPU e determina qual processo será executado em seguida.

Dependendo da configuração de hardware do sistema, o comprimento desta fila executável, chamada fila de execução da CPU, pode ser curta ou longa. Um comprimento curto da fila sinaliza que a CPU está subutilizada. Por outro lado, se a fila de execução for longa, significa que a CPU não é poderosa o suficiente para executar todos os processos ou que não há núcleos suficientes na CPU. Em uma CPU idealmente utilizada, o comprimento da fila de execução será igual ao número de núcleos em um sistema.

Existem alguns comandos no sistema operacional Linux que ajudam a determinar o comprimento da fila de execução da CPU, a utilização da CPU e a utilização de recursos para entender se o desempenho do sistema está sendo afetado. Neste artigo, revisamos alguns desses comandos e como usá-los.

Comandos para monitorar a fila de execução da CPU

O Linux vem com alguns comandos para monitorar a carga na CPU. Enquanto prosseguimos com esses comandos, tenha em mente que se as informações que eles fornecem forem insuficientes, ferramentas de terceiros também estarão disponíveis publicamente.

Relatório de atividades do sistema (sar)

O comando sar faz parte do pacote sysstat, que não vem pré-instalado em nenhuma distribuição Linux. Ele pode ser instalado usando os comandos abaixo.

Para sistemas baseados em Debian:

apt install sysstat

Para sistemas baseados em RPM:

yum install sysstat

O comando sar ajuda a reunir todas as atividades necessárias do sistema e estatísticas de desempenho. Este comando aceita opções para exibir métricas sobre recursos como CPU, memória, rede, discos, filas e muito mais. A opção q é usada para acessar o comprimento da fila de execução e a carga média da CPU usando o comando sar. O output do comando fornece as seguintes informações:

  • runq-sz: Comprimento da fila de execução
  • plist-sz: Número de tarefas na lista de tarefas
  • ldavg-1: Média de carga do sistema pelo último minuto
  • ldavg-5: Média de carga do sistema pelos últimos cinco minutos
  • ldavg-15: Média de carga do sistema pelos últimos 15 minutos
  • bloqueadas: Número de tarefas atualmente bloqueadas, aguardando a conclusão da I/O

Junto com a opção, o comando também precisa do intervalo de atualização. O intervalo de atualização, um número, representa a frequência com que o output deve ser atualizado. Por exemplo, o comando a seguir atualizará o output a cada segundo, adicionando uma nova linha à tabela:

sar -q 1

A Figura 1 abaixo mostra o output do comando sar atualizando a cada segundo.

Fig. 1: sar command output Fig 1: saída do comando sar

A carga neste sistema específico é extremamente baixa – a fila de execução na captura de tela é zero. Enquanto isso, existem mais de 768 tarefas na lista de tarefas, mas uma observação atenta revela que o número de tarefas está diminuindo. Isso significa que a carga neste sistema não é pesada – o sistema está superconfigurado para as tarefas que executa. A carga média nos últimos minutos também nos diz que praticamente não há carga na CPU, mesmo sendo apenas uma unidade de núcleo único. Também não há processos bloqueados.

O comando ps

O comando ps é outra ferramenta útil para verificar o estado dos processos. A lista de processos pode ser filtrada usando as diversas opções disponíveis para o comando. O output do comando ps inclui a coluna STAT, que exibe o estado de cada processo em execução. A Figura 2 mostra um exemplo de output.

Fig. 2: ps command output Fig 2: saída do comando ps

A primeira letra do valor da coluna STAT é o estado do processo, onde S significa suspensão e R significa executável.

O comando top

O comando top pode exibir o estado de qualquer processo. Essas opções podem ser usadas para filtrar resultados e obter uma lista de processos relevantes.

Fig. 3: top saída de comando Fig 3: saída de comando top

A coluna S no output do comando top, conforme mostrado na figura 3, denota o estado do processo. A imagem também mostra o comando top em execução (R) e um processo Docker no estado de suspensão.

O comando top também fornece os três valores médios de carga da CPU no canto superior direito. Esses números representam a carga média da CPU nos últimos 1, 5 e 15 minutos. A Figura 3 mostra que a carga média não passou de 0,0 nos últimos 15 minutos.

O arquivo de status /proc

O Linux armazena todas as informações relacionadas ao processo como arquivos no diretório /proc. Cada processo obtém seu próprio diretório, sendo o ID do processo (PID) o nome do diretório. Cada diretório PID contém um arquivo chamado status que contém todas as informações do processo, incluindo seu estado. Portanto, um simples cat no arquivo e grep para filtrar o State informará o estado do processo. O comando abaixo indicará o estado do processo Docker em execução em um sistema Linux. O PID do processo Docker é retirado da figura 3 acima.

cat /proc/126/status | grep State

A Figura 4 abaixo mostra o output deste comando.

Fig. 4: Estado de um processo usando o arquivo de status /proc Fig. 4: Estado de um processo usando o arquivo de status /proc /proc

Utilização da CPU versus comprimento da fila de execução: entendendo as métricas

Os três números de utilização da CPU fornecidos por comandos como top, sar, e uptime representam a carga que a CPU está recebendo e quanto espaço ainda está disponível. Este número de utilização inclui processos nos estados em execução, executável e interrompido. Por exemplo, um número inferior a 1,0 em uma CPU de núcleo único significa que ainda há espaço para novos processos. Uma carga de 1,0 em um processador de núcleo único significa que 100% da CPU é utilizada, enquanto qualquer valor acima de 1,0 significa que uma CPU de núcleo único está sobrecarregada.

Da mesma forma, em um processo dual-core, uma carga média de 2,0 indica 100% de utilização da CPU, 4,0 em um processador quad-core indica 100% de utilização e assim por diante. Como essa utilização está relacionada ao comprimento da fila de execução da CPU? Lembre-se de que o cálculo da carga média inclui processos nos estados em execução e executável, que também são os estados que representam a fila de execução de uma CPU. Portanto, mesmo que a fila de execução seja longa, o desempenho do sistema não será comprometido, desde que a carga média esteja dentro da medida de 1,0 por núcleo.

Isso ocorre porque a CPU é capaz de executar com eficiência todos os processos no prazo e manter a carga média sob controle, mesmo com um grande número de processos aguardando o tempo da CPU.

Você também deve considerar a carga média dos últimos 5 e 15 minutos porque esses números indicam a carga média sustentada durante um período substancial de tempo. Se a CPU estiver sobrecarregada, isso resultará em uma carga média mais alta.

Como resolver problemas de alta carga

Existem duas maneiras de resolver problemas de alta carga: adicionar mais hardware ao sistema ou otimizar o código para melhor utilizar os recursos. Por exemplo, se um cluster de servidores recebe cargas altas regularmente, o cluster pode ser ampliado adicionando mais nós a ele ou ampliado adicionando mais memória e CPUs maiores e mais rápidas a cada nó.

Mas esta abordagem pode não ser sustentável se o código executado nesses nós não for otimizado. Por exemplo, se o código não estiver liberando a memória de volta para o pool ou se o código estiver bloqueando outros programas, retendo recursos por mais tempo do que o necessário, adicionar mais hardware não melhorará a carga média.

O uso do comando iotop revelará a lista de todos os processos que utilizam os recursos de I/O, tornando mais fácil entender por que um processo pode estar bloqueado (ou bloqueando outros processos) ou usar recursos por um longo tempo. A combinação dessas informações com os números médios de carga da CPU deve fornecer uma imagem mais clara da utilização da CPU.

Problemas de alta carga geralmente surgem quando o código não está otimizado, então este deve ser o foco principal. O escalonamento de hardware é feito somente após a conclusão da otimização do código.

Resumo

Embora o comprimento da fila de execução da CPU indique o número de processos prontos para serem agendados para o tempo de CPU, ele nem sempre fornece o quadro completo. Conforme demonstrado, um grande número de tarefas na lista de tarefas ainda pode resultar em uma carga baixa na CPU.

Alternativamente, mesmo um pequeno número de processos na fila de execução pode levar a uma carga elevada da CPU. Nesses casos, é importante monitorar as operações de I/O para verificar gargalos, que podem ser a causa subjacente.

Usando os comandos listados neste artigo, você pode monitorar facilmente o comprimento da fila, a lista de tarefas e a carga média da CPU. Além disso, medidas como aumentar ou diminuir o cluster e otimizar o código podem ajudar a evitar problemas de alta carga.

Was this article helpful?
Monitore seus servidores de nomes de domínio

Garanta a disponibilidade e o desempenho dos seus servidores de nomes de domínio e fique à frente de possíveis erros de resolução de domínio.

Write For Us

Write for Site24x7 is a special writing program that supports writers who create content for Site24x7 "Learn" portal. Get paid for your writing.

Write For Us

Write for Site24x7 is a special writing program that supports writers who create content for Site24x7 “Learn” portal. Get paid for your writing.

Apply Now
Write For Us