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

12

Eu acho que a questão é, 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 ocioso) e isso me daria 100% e cada coluna individual poderia ser transformada em porcentagem por (coluna / 100_percent) * 100

  • usuário: processos normais em execução no modo de usuário
  • legal: processos agradáveis executados no modo de usuário
  • system: processa a execução no modo kernel
  • ocioso: polegares ao redor
  • iowait: aguardando a conclusão da E / S
  • irq: interrupções de serviço
  • softirq: serviço de softirqs
  • steal: espera involuntária
  • guest: executando um convidado normal
  • guest_nice: executando um convidado especial

Esta é uma abordagem viável ou estou totalmente fora do caminho?

    
por Istvan 04.01.2014 / 01:52

4 respostas

11

Você está no caminho certo, top usa esse arquivo para essa finalidade. Mas você precisa ler 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, então divida por isso, mas isso lhe daria uma taxa de utilidade do host desde que a máquina foi inicializada.

Se você quiser uma taxa superior a 5 segundos, você deve ler o arquivo uma vez, dormir por 5 segundos, lê-lo novamente, obter a diferença dos cálculos e dividir por 5.

    
por 04.01.2014 / 01:59
6

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

Aqui está um exemplo prático:

Reassumindo->Vocêpodefazerisso,nãoédifícilapenasmatemáticabásicaemeusgráficossãoumexemplovivodisso.Paracoletardadoseufaçouminstantâneode/proc/statparaumarquivotemporáriolocaltednoramdiskeentãoeuanalisoarquivoparacoletardadosacada1minuto.

comoeuanalisoosdados(fragmentodoscriptbash):

cat=/bin/cat#othersdefinedthesameway......$cat/proc/stat>/ramdisk/tmp/statssCpuRawUser='$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 Você obtém dados no banco de dados rrd Você pode representar graficamente e o céu é o limite :) link

    
por 07.01.2014 / 02:08
4

Se você quiser 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 )/100 , em seguida, essa linha é alimentada para bc. Terá algo parecido com -7.84000000000000000000 , depois, basta enviá-lo para 100-$(value) e alimentar novamente para bc

Lá: sleep # - atraso de 1 segundo, se você alterar esse valor, o resultado intermediário deverá ser dividido ao número de segundos. $5 - quinto campo, de acordo com man proc e link

Por favor, deixe-me saber se isso não funciona para você.

    
por 06.01.2014 / 18:15
0

Ou se você está feliz com apenas dois dígitos após o ponto, o awk pode 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
    
por 27.07.2015 / 03:05