Como funciona a contabilidade do consumo de CPU no Linux?

top-command É muito comum observarmos confusões técnicas sobre como o Linux executa a contabilidade do consumo de CPU. Não obstante, uma boa parte dos sysadmins não entendem como é o período de amostragem dos comandos top e ps, e o que ele realmente representa.

Neste sentido, o texto que segue, confeccionado pelo amigo Fábio Olivé, é quase um “serviço de utilidade pública”. Motivado por uma thread no TcheLinux.org, ele aborda de forma bastante clara e didática a relação entre o gerenciamento do time-sharing executado pelo Kernel do sistema, e os dados por amostragem que podem ser obtidos especialmente pelo comando top.

Dúvida encaminhada por um membro do grupo TcheLinux.org:

> pessoal estou querendo usar o ps para visualizar os processos que estão ocupando mais recursos, da mesma forma que o top faz, colocando  no inicio da lista os processos que estão consumindo mais recursos…

Resposta dada pelo Fábio Olivé:

Tu podes usar o próprio top dessa forma, usando o “modo batch” com a opção “-b”. Por exemplo: top -b -n1 -d5 | head -15.

Neste caso a opção “-b” faz ele simplesmente colocar os dados na saída sem ser “orientado a tela”, o “-n1” faz ele rodar apenas uma vez, e o “-d5” faz ele esperar 5 segundos entre a primeira e a segunda medida de tempo de CPU, para então emitir as informações.

Note que o sistema não guarda a informação sobre quanto de CPU um processo está consumindo no momento, ele apenas guarda o tempo que um processo esteve em execução até o momento. O sistema guarda “quanto já consumiu”, e não “quanto consome agora”, pois esta informação é muito volátil.

O “quanto consome agora” é medido pelo top em termos da diferença de tempo de CPU entre uma medida e outra, então ele te mostra como “agora” a diferença entre agora e alguns segundos atrás.

Entender isso é importante pra tu aprender a obter resultados menos voláteis ao mexer no “-d”. Quanto mais tempo esperar, menos volátil e mais preciso será o resultado. Tem muita gente que procura entender o comportamento de certos processos fazendo loops no shell capturando tops e etc. Por exemplo, um uso comum porém pouco preciso é fazer isso:

while :; do
   top -b -n1 >> log-do-top.txt
   sleep 60
done

Isso vai coletar um top por minuto, e muita gente vai achar que a informação do top vai contemplar todo o minuto passado, mas não vai. Esse loop vai rodar um top novo a cada iteração, então o top vai apenas usar duas medidas com tempo (default) de meio segundo entre elas e colocar isso na saída. Esse laço vai apenas então pegar amostras de meio segundo a cada minuto.

Se for feito da maneira abaixo, sem loop, vai gerar uma saída por minuto comparando realmente toda a mudança entre o minuto passado e o atual, pois é o mesmo processo top, e tem acesso ao que mediu antes e ao que mediu agora para poder comparar:

top -b -d60 >> log-do-top.txt 

Se quiser fazer algo como “medir por 15 minutos”, bota um “-n15” ali, que ele vai rodar 15 iterações, com 60 segundos entre cada uma, e realmente comparando todas as alterações de tempo de execução entre um minuto e outro. Em um servidor ocupado, essa informação vai ser muito diferente daquela gerada pelo loop lá em cima, e muito mais precisa.