Existe uma maneira de calcular a porcentagem de utilização da CPU lendo / proc / stat de uma só vez?

12

Eu acho que a pergunta é: eu poderia de alguma forma calcular a porcentagem de utilização da CPU apenas lendo o / proc / stat uma vez?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

Estou pensando em resumir as colunas, exceto o IOWait (eu estava lendo em algum lugar que é contado no modo inativo) e isso me daria 100% e cada coluna individual poderia ser transformada em porcentagem por (column / 100_percent) * 100.

  • usuário: processos normais em execução no modo de usuário
  • nice: niced processos em execução no modo de usuário
  • system: processos em execução no modo kernel
  • inativo: polegares giratórios
  • iowait: aguardando a conclusão da E / S
  • irq: interrupções de manutenção
  • softirq: serviços softirqs
  • roubar: espera involuntária
  • guest: executando um convidado normal
  • guest_nice: executando um convidado niced

Esta é uma abordagem viável ou estou totalmente fora da pista?

Istvan
fonte

Respostas:

11

Você está no caminho certo, topusa esse arquivo para esse fim. Mas você precisa lê-lo mais de uma vez.

A utilização é uma medida de uso ao longo do tempo. Você pode lê-lo uma vez, desde que saiba o tempo de atividade em segundos do host, depois divida por isso, mas isso forneceria uma taxa de utilidade do host desde que a máquina foi inicializada.

Se você quiser uma taxa superior a 5 segundos, leia o arquivo uma vez, durma por 5 segundos, leia-o novamente, obtenha a diferença dos cálculos e divida por 5.

Matthew Ife
fonte
6

Sua abordagem está correta. Você pode usar / proc / stat como dados brutos e alimentar, por exemplo, rrdtool com eles. Eu já fiz algo assim, então sei que 100% é possível. Em seguida, é possível representar graficamente toda a carga do sistema ou cada núcleo individualmente.

Aqui está um exemplo de trabalho meu: insira a descrição da imagem aqui

Reassumindo -> Você pode fazê-lo, não é difícil apenas a matemática básica e meus gráficos são um exemplo disso. Para coletar dados, faço uma captura instantânea de / proc / stat em um arquivo temporário localizado no ramdisk e analiso esse arquivo para coletar dados a cada 1 minuto.

como analiso os dados (fragmento do script bash):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

depois de obter dados no banco de dados rrd, você pode representar graficamente e o céu é o limite :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html

Bartłomiej Zarzecki
fonte
Como você analisa os dados?
ewwhite
@ewwhite -> editei minha resposta para mostrar como analiso os dados.
Bartłomiej Zarzecki
Belos gráficos! Em relação à sua anotação de coluna ausente: askubuntu.com/a/120961/451886 . Se estiver sendo executado em uma VM, talvez seja o contador "roubado".
Rkagerer 19/09/15
+1 para rrdtool e ramdisk!
shadi
4

Se você quiser o oneliner, pode ser assim:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

O resultado: 97.17000000000000000000

Como funciona:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

produz ( 1055057784 - 1055058055 )/100então essa linha de alimentação para bc. Vai ter algo como -7.84000000000000000000, então apenas embrulhe 100-$(value)e alimente para bc novamente

Lá: sleep #- Atraso de 1 segundo, se você alterar esse valor, o resultado intermediário deverá ser dividido pelo número de segundos. $5- 5º campo, de acordo com man proce http://www.linuxhowtos.org/System/procstat.htm

Informe-me se isso não funcionar para você.

Putnik
fonte
0

Ou se você estiver satisfeito com apenas dois dígitos após o point awk, poderá fazer tudo muito mais simples e legível:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
slaxor
fonte