Obtendo o uso da CPU em tempo real

11

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 recebendo 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.

Eu quero obter uso da CPU em tempo real na saída. Por favor me ajude a melhorar meu comando.

Ketan Patel
fonte
monitoramento em tempo real askubuntu.com/questions/293426/…
Qasim
Este script simples festa faz exatamente isso: askubuntu.com/a/450136/243213
Craig van Tonder

Respostas:

20

Se você puder pagar um atraso de um segundo, isso imprimirá o uso da CPU como uma porcentagem simples:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Sem o atraso de um segundo, vmstatsó é possível imprimir valores médios desde a inicialização.)

Paulo
fonte
Não me dá um% exato (comparando com htop)
Lepe
1
Você precisa usar vmstat 1 2assim: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] caso contrário, você vmstatfornecerá valores desde a inicialização, o que provavelmente não é o que você procura.
Joe
Joe obrigado, funciona. por favor Paul, editar a resposta para que todos possam ver a linha de comando correto
Pavlos Theodorou
Obrigado por assistir, Joe e Pavlos! Não notei essa parte da página de manual.
Paul
9

Esse é um problema conhecido com top. Conforme explicado aqui , a primeira iteração de 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 dintervalo entre as iterações para 0.01. topdivide o uso da CPU entre usuário, processos e processos do sistema nice, queremos a soma dos três. Finalmente, você é grepa linha que contém as porcentagens da CPU e, em seguida, usa gawkpara somar usuário, sistema e processos agradáveis:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode
Terdon
fonte
Todos os outros métodos, incluindo sar, mpstat ... etc, mostram 2/3%, enquanto este comando sempre mostra 50%.
CMCDragonkai
@CMCDragonkai os números devem mudar (acabei de verificar) você tem certeza de que copiou / colou corretamente? Além disso, observe que em sistemas com várias CPUs, topreportará o% de uso como uma porcentagem de uma única CPU. Isso significa que você geralmente obtém porcentagens muito mais altas. Veja o ponto 9 aqui .
terdon
Eu acho que esse comando pode não ser compatível com o meu sistema. Mas é aparente que todos os outros métodos que eu tentei me dão uma porcentagem de 1/2/3%, que é o que eu vejo se executar o htop, enquanto esse comando me dá uma anomalia.
CMCDragonkai
@CMCDragonkai é por causa das várias CPUs. Você pode obter o número retornado por isso e dividir pelo número de núcleos ou pode usar topno modo interativo (apenas executar top) e, uma vez lá, pressionar I(shift + i) para ver uma divisão por núcleos.
terdon
Eu tenho apenas 1 CPU.
CMCDragonkai
7

Eu tentei de várias maneiras, mas isso me parece mais preciso:

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)}'

Entendi daqui

lepe
fonte
meu linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Sat May 19 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) não possui a coluna $ 15 (linha de cpu do arquivo / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou
1
Melhor resposta! Obrigado! Minha variação: cat <(grep 'cpu' / proc / stat) <(sono 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp
A diferença do maXp é que ele é impresso arredondado com um único decimal:, o que %.1f, na minha opinião, é mais legível por humanos e útil se você usar essa saída em outros scripts.
Lepe
0

Use -n2. Isso produzirá duas linhas. A primeira vez que topa linha é impressa não se qualifica para o estado naquele momento. Em seguida, ajuste seu script para ignorar a primeira linha.

ilp
fonte