Como obter o uso geral da CPU (por exemplo, 57%) no Linux [fechado]


194

Gostaria de saber como você pode obter o uso da CPU do sistema e apresentá-lo em porcentagem usando o bash, por exemplo.

Saída de amostra:

57%

Caso haja mais de um núcleo, seria bom se uma porcentagem média pudesse ser calculada.


1
@julesanchez o valor precisa ser canalizado em outro lugar, portanto, deve ser um int #
user1199739

doing top> myfile.txt E aplicar o filtro no pós-tratamento, não está bem?
21412 JuSchz

11
Um comando que não requer o sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon 03/03

7
Reabertura Não entendo por que isso foi considerado fora de tópico. Os que o fecharam podem querer elaborar?
Jonathan H

3
O meu entendimento de /proc/staté muito limitado, mas este one-liner funciona bem o suficiente para mim: cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Com% .2f, você pode controlar o número de casas decimais que deseja gerar e com sleep 1o tempo que deseja calcular a média, ou seja, se fizer o que acho que faz. Você pode colocá-lo em um loop bash while, para testá-lo em tempo real.
Yeti

Respostas:


174

Dê uma olhada em cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

EDITAR leia os comentários antes de copiar e colar isso ou usá-lo para qualquer trabalho sério. Isso não foi testado nem usado, é uma idéia para pessoas que não desejam instalar um utilitário ou para algo que funcione em qualquer distribuição. Algumas pessoas pensam que você pode "apt-get install" qualquer coisa.

NOTA: esse não é o uso atual da CPU, mas o uso geral da CPU em todos os núcleos desde a inicialização do sistema. Isso pode ser muito diferente do uso atual da CPU. Para obter o valor atual superior (ou ferramenta similar) deve ser usado.

O uso atual da CPU pode ser potencialmente calculado com:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
Mas você precisa instalar o mpstat como recomendado acima. Muitas pessoas não têm essa flexibilidade. cat / proc / stat então o pipe é muito mais fácil que o mpstat que você recomenda.
vimdude

12
+1 Não entendo por que a análise de outro utilitário é melhor que a análise/proc/stat
Reinstate Monica Por favor,

9
sistema + usuário + ocioso = 100%. Então, talvez algo como: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude

106
Penso que esta solução não mostra a carga atual da CPU, mas a carga média da CPU desde que a CPU foi iniciada.
Etienne

11
@ Jlliagre, sim, isso mesmo. Para calcular o uso da CPU ATUAL e não a média, você precisará pegar o valor de $ 1 e, em seguida, adiar o valor de $ 1 e ver a diferença. Esse é o uso atual da CPU.
vimdude

102

Podes tentar:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Toda vez que executo esse comando, recebo exatamente a mesma saída ( 32.7%).
Alanaktion 18/07/2013

13
Um resultado mais preciso é fornecido quando uso top -bn2, mas leva muito tempo. Pelo que li, essa parece ser a única maneira de obter um resultado preciso.
Alanaktion

6
top -bn1parece muito impreciso no meu sistema FC20. top -bn2parece funcionar bem.
Martin Tournoij

23
O comando nesta resposta parece estar escrito para sistemas em que top -vretorna procps-ng(por exemplo, Fedora). Também existe procps, por exemplo, Ubuntu e CentOS, onde o comando não funciona (sempre indica 100%, porque a análise falha devido à linha com as figuras da CPU sendo formatadas de forma diferente). Aqui está uma versão que funciona com ambas as implementações:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
Nota lateral: no OSX, use o seguinte: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
usar o seguinte comando

38

Experimente a mpstatpartir do sysstatpacote

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Depois, alguns cutou greppara analisar as informações necessárias:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
Eu não acredito que isso mostra a total da CPU
user1199739

Eu diria que 100-% ocioso que é o uso total de CPU (em%)
Peter Svensson

Essa é a porcentagem "não" usada. Esta resposta foi boa, até o grep | cauda | awk parte ...
jordanm

Eu mudaria a awkparte para awk -F " " '{print (100 - $12)"%"}':, que fornece a saída formatada como ele queria, mas, caso contrário, isso parece bom para mim.
Dan Fego 10/02/12

1
@jordanm Todas as verdades; Eu estava votando mais porque funciona. Eu faria isso pessoalmente:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego 10/02/12

22

Poderia também gerar uma resposta real com a minha solução, inspirada em Peter Liljenberg:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Isso será usado awkpara imprimir 100 menos o 12º campo (inativo), com um sinal de porcentagem depois dele. awkfará isso apenas para uma linha em que o 12º campo tenha apenas números e pontos ( $12 ~ /[0-9]+/).

Você também pode obter em média cinco amostras, com um segundo de diferença:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Teste assim:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
É melhor executar "mpstat 2 1 | ..." para mostrar estatísticas nos últimos 1 segundo. Caso contrário, por padrão, o mpstat mostra estatísticas desde o início e isso não muda muito à medida que o tempo avança
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9.Girls +/ {print 100 - $ 11"% "}'" "este trabalho para mim.
AloneInTheDark 26/02

@ Sarang Muito obrigado !! Finalmente, posso obter os resultados que também conkyestão sendo exibidos. Infelizmente, esta linha é MUITO lenta, quase demorando um segundo para ser executada.
Syntaxerror 15/09/14

6
@syntaxerror Demora exatamente 2 segundos, porque se você olhar para o comando, verá que o primeiro argumento é que é o intervalo, mas é executado apenas uma vez por causa do segundo argumento, e aguarda 2 segundos inteiros até retornar o resultado.
Johan Bjäreholt

A pergunta está encerrada, então adicionei a minha resposta (semelhante) à sua :-) Espero que você não se importe. Como você, fui inspirado pela resposta de Peter Liljenberg.
PJ Brunet

16

EDITADO: Observei que na resposta de outro usuário o% ocioso era o campo 12 em vez do campo 11. O awk foi atualizado para considerar o campo% ocioso sendo variável.

Isso deve gerar a saída desejada:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Se você deseja um arredondamento inteiro simples, pode usar printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'funciona muito bem para mim, obrigado. observar o mpstat 1 1 para assegurar que o uso de CPU é amostrado ao longo de um segundo
chrishiestand

1
Se você tiver jq:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet 29/03/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.