C'è un modo per calcolare la percentuale di utilizzo della CPU leggendo / proc / stat contemporaneamente?


12

Immagino che la domanda sia: potrei in qualche modo calcolare la percentuale di utilizzo della CPU semplicemente leggendo una volta / proc / stat?

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

Sto pensando di riassumere le colonne tranne l'IOWait (stavo leggendo da qualche parte che è conteggiato in idle) e questo mi darebbe il 100% e ogni singola colonna potrebbe essere trasformata in percentuale di (colonna / 100_percent) * 100.

  • utente: processi normali in esecuzione in modalità utente
  • bello: processi niced in esecuzione in modalità utente
  • sistema: elabora i processi in modalità kernel
  • inattivo: pollice in su
  • iowait: in attesa del completamento dell'I / O
  • irq: interruzioni di manutenzione
  • softirq: manutenzione di softirqs
  • rubare: attesa involontaria
  • ospite: eseguire un ospite normale
  • guest_nice: esecuzione di un guest ordinato

È un approccio praticabile o sono totalmente fuori strada?

Risposte:


11

Sei sulla strada giusta, topusa questo file per questo scopo. Ma devi leggerlo più di una volta.

L'utilizzo è una misura dell'uso nel tempo. Puoi leggerlo una volta a condizione che tu sappia il tempo di attività in secondi dell'host, quindi dividerlo per quello, ma ciò ti darebbe un tasso di utilità dell'host da quando la macchina è stata avviata.

Se si desidera un tasso superiore a 5 secondi, leggere il file una volta, dormire per 5 secondi, leggerlo di nuovo, ottenere la differenza dei calcoli e dividere per 5.


6

Il tuo approccio è corretto. È possibile utilizzare / proc / stat come dati non elaborati e alimentare ad esempio rrdtool con esso. Mi sono fatto qualcosa del genere, quindi so che al 100% è possibile. È quindi possibile rappresentare graficamente l'intero carico del sistema o ciascun core singolarmente.

Ecco un mio esempio funzionante: inserisci qui la descrizione dell'immagine

Riassumendo -> Puoi farlo, non è difficile solo la matematica di base e i miei grafici ne sono un esempio dal vivo. Per la raccolta dei dati faccio un'istantanea di / proc / stat su un file temporaneo localizzato su ramdisk e quindi analizzo quel file per raccogliere dati ogni 1 minuto.

come analizzo i dati (frammento di 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.

dopo aver ottenuto i dati nel database rrd È possibile rappresentare graficamente e sky è il limite :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html


Come si analizzano i dati?
ewwhite,

@ewwhite -> Ho modificato la mia risposta per mostrare come analizzo i dati.
Bartłomiej Zarzecki,

Bellissimi grafici! Per quanto riguarda l'annotazione di colonna mancante: askubuntu.com/a/120961/451886 . Se è in esecuzione in una VM, forse è il contatore "ruba".
rkagerer,

+1 per rrdtool e ramdisk!
Shadi,

4

Se vuoi oneliner potrebbe apparire così:

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

Il risultato: 97.17000000000000000000

Come funziona:

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

produce ( 1055057784 - 1055058055 )/100quindi questo feed di riga a bc. Avrà qualcosa di simile -7.84000000000000000000, quindi avvolgilo 100-$(value)e alimentalo di nuovo a bc

Ecco: sleep #- 1 secondo di ritardo, se si modifica questo valore, il risultato intermedio deve essere diviso per il numero di secondi. $5- 5 ° campo, secondo man proce http://www.linuxhowtos.org/System/procstat.htm

Per favore fatemi sapere se questo non funziona per voi.


0

O se sei soddisfatto di solo due cifre dopo il punto awk può fare tutto molto più semplice e più leggibile:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.