Obtendo o uso da CPU sempre o mesmo.

13

Quando executo o seguinte comando para obter o uso da CPU, recebo um bom uso do usuário + da CPU.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Resultado:

14.5

Aqui estou obtendo o problema é que a saída depende do comando top, portanto, não muda instantaneamente como comando top. Então, eu não estou recebendo a CPU correta instantaneamente. Dá a mesma saída e não muda.

Quero obter cpuusage em tempo real na saída. Por favor me ajude a melhorar meu comando.

Ketan Patel
fonte
1
E a questão é?
Dennis Kaarsemaker 26/03
Tente executar o comando anexado com time. No meu sistema, são necessários apenas 0,165s.
depquid 26/03
Por favor, me dê um comando editado.
Ketan Patel
Tente:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid 28/03
não Diffrence na saída, depois testadas em sistemas diferentes
Ketan Patel

Respostas:

13

Você está certo, topparece fornecer uso incorreto da CPU na primeira iteração. Você pode solucionar esse problema da seguinte maneira:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Obviamente, isso levará o dobro do tempo, mas funcionará de qualquer maneira.

Se você ainda deseja que ele funcione mais rápido, pode usar a -dopção, por exemplo, para um período total de medição de 1 segundo, use metade dela:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Ruslan
fonte
serverfault.com/a/436499/134517 também levará muito mais que o dobro do tempo, pois levará aproximadamente um segundo em vez de quase nenhum.
altendky
Além do comentário de altendky, consulte também a resposta de terdon para obter explicações sobre o motivo da questão.
Ruslan
6

Tecnicamente, o primeiro topnem sempre gera o mesmo valor; apenas gera a carga média da CPU desde a última inicialização. Como topusa o delta de /proc/statestatísticas para calcular a carga da CPU, o primeiro valor é calculado ao comparar com zero, produzindo resultados incorretos (mas WAD).

Se você não quiser usar top, poderá analisar diretamente /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

Também é mais rápido e preciso dessa maneira.

Você pode testá-lo com stress:

stress -c 1 -q &

E fazer

killall stress

depois de.


fonte
Agradável. E se o seu comando for colocado em um arquivo chamado 'cpu', ele watchpoderá ser executado:watch -n1 "bash ./cpu"
Brent Faust
Seu script awk para analisar /proc/staté bem legal, mas parece ter a mesma desvantagem da primeira iteração do topo: ele gera a carga média da CPU desde a última inicialização, não a atual.
31416 Pieroxy
5

Apenas para expandir a resposta de @ Ruslan, topdivide o uso da CPU entre usuário, processos e processos do sistema nice, queremos a soma dos três. Portanto, podemos executar topno bmodo atch, o que nos permite analisar sua saída. No entanto, conforme explicado aqui , a primeira iteração top -bretorna as porcentagens desde a inicialização, portanto, precisamos de pelo menos duas iterações ( -n 2) para obter a porcentagem atual. Para acelerar as coisas, você pode definir o dtempo entre as iterações para 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
terdon
fonte
4

Talvez use este baseado na pssaída:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }
GHugo
fonte
0

Use o comando watch ou for loop no shell,

ie watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"

margarida
fonte
A mesma coisa acontece com o relógio
Ketan Patel
0

Por que você se importa com o uso da CPU? A média de carga é um indicador muito melhor:

cat /proc/loadavg

Se você realmente precisa do uso da CPU, a análise /proc/staté provavelmente o caminho a percorrer.

Martin von Wittich
fonte
1
A média de carga é basicamente uma integral de tempo do uso da CPU (dividida pelo tempo). Por que você diria que uma característica integral é um indicador muito melhor [de tudo] do que um diferencial quando eles têm casos de uso completamente diferentes? Além disso, /proc/statnão fornece o uso da CPU como é, é preciso lê-lo duas vezes com algum tempo entre as leituras e fazer alguns cálculos para obter o uso da CPU. Isto é exatamente o que topfaz.
Ruslan
Não sei matemática, então tenho que admitir que realmente não entendo a diferença entre integral e diferencial: / "A média de carga é basicamente uma integral de tempo do uso da CPU" - é mesmo? AFAIK, um processo que trava no estado D causa um aumento de carga, mas nenhum uso da CPU. "Por que você diria ..." - O OP não diz o que ele realmente deseja realizar, portanto, para ser honesto, presumo que ele queira medir a carga do sistema e pensei que o uso da CPU seria o melhor indicador para isso , então eu o instruí a carregar a média.
Martin von Wittich
No seu link: "Os sistemas calculam a média de carga como a média móvel exponencialmente amortecida / ponderada do número de carga". e "a carga do sistema é uma medida da quantidade de trabalho computacional". O estado D não está executando nenhum trabalho computacional. O que está acontecendo são os processos que usam o tempo da CPU. Portanto, a carga média é basicamente a porcentagem de tempo em que a CPU não ficou ociosa por um período de tempo (por exemplo, minutos a dezenas de minutos). E o uso da CPU é a porcentagem de tempo em que a CPU não fica ociosa na escala de tempo de milissegundos - ou seja, é atualizada sempre que você a lê e reflete o estado atual .
Ruslan
-2

Usando o sarcomando

sar 1 10

Isso significa: obter 10 vezes o resultado a cada segundo

Philip Ngun
fonte