Como posso receber estatísticas da CPU top-like do shell?

12

Estou tentando obter uma leitura precisa da minha CPU usada (em porcentagem) de top. Este é o comando que estou executando para testar:

top -n1 | awk '/Cpu\(s\):/ {print $2}'

Isso retorna:

10.7%us,

Qual é o pedaço de dados adequado que eu quero. No entanto, toda vez que executo o comando, obtenho a mesma saída, mesmo aplicando cargas diferentes no meu sistema (sem mencionar, htopdiz que meu uso é diferente). Parece que sempre que eu começo top, o uso da minha CPU é o mesmo. Somente depois de alguns quadros ele me fornece valores adequados.

Não parece que eu possa analisar a saída do top dessa maneira, então estou procurando outros aplicativos confiáveis ​​que me fornecerão uma leitura precisa do shell. Eu realmente gosto de como htoppode me dar uma leitura por núcleo.

Eu tentei iostate mpstateles parecem dar valores imprecisos e "lentos para mudar".

n0pe
fonte
2
Não. A pergunta correta a ser feita é: Como obtenho estatísticas de uso da CPU de alto nível no shell?
Stéphane Gimenez
@ StéphaneGimenez thanks
Modifiquei

Respostas:

12

Eu uso este script (a partir desta discussão nas placas do Arch ):

#!/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
jasonwryan
fonte
O Linux tem ótimas informações em / proc / - veja linux.die.net/man/5/proc para todas as vantagens. Apenas tome cuidado, pois estes são apenas Linux. Não há realmente nenhuma maneira multiplataforma de obter essas informações, a menos que você use uma biblioteca como a Sigar .
Pat Notz
A ideia é boa, mas alguns detalhes estão incorretos. O valor ocioso é a 5a coluna e você também deve adicionar a coluna iowait (6a coluna) para obter uma porcentagem razoável. Para estar totalmente correto, você também precisará adicionar todos os valores de "descanso", mas eles geralmente são muito pequenos.
Peter Eisentraut
O valor inativo é a quinta coluna, se você estiver contando a coluna "cpu". Caso contrário, é o quarto.
SunSparc
6

Confira o sar também. As implementações podem variar amplamente de nix para nix, mas devem fornecer estatísticas básicas do sistema, em determinados snapshots. Eu não tenho certeza o quão preciso os valores estão no ponto em que o comando é inicializado pela primeira vez, mas você pode jogar ao redor para ver como ele se compara ao top, iostatetc.

A saída é baseada em colunas, como a parte superior, portanto, você poderá canalizar a saída para awkou cutmanipular os resultados.

tcdyl
fonte
Eu tentei sarantes com resultados mistos. Vou seguir a resposta de @ jasonwryan aqui porque posso modificá-la facilmente para representar o uso com os dois núcleos da CPU.
n0pe
0

O que descobri é semelhante à pessoa que fez a pergunta acima, pelo menos no CentOS 6. Se eu rodar no topo do modo em lote por apenas uma iteração, ele parece coletar a mesma figura, quase como se sua tendência fosse começar com o que ele lembra pela última vez a exibição. Top parece precisar acumular pelo menos alguns números para obter deltas para fornecer porcentagens corretas. Depois de testar mais de 10 iterações, descobri que a segunda figura exibida mostrava diferenciação suficiente em cada execução. Portanto, é fácil obter essa linha via

top -b -n 2 | grep Cpu | tail -1

Eu gosto de incorporar isso com tempo de atividade para carregamento e um filtro grep de processos selecionados do ps, como consultas do postgres. Um monitor muito simples pode ser expresso com o alias:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"
Robert Casey
fonte