Gibt es eine Möglichkeit, die prozentuale CPU-Auslastung durch gleichzeitiges Lesen von / proc / stat zu berechnen?

12

Die Frage ist wohl, ob ich den Prozentsatz der CPU-Auslastung irgendwie berechnen kann, indem ich das / proc / stat einmal lese.

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

Ich denke darüber nach, die Spalten mit Ausnahme des IOWait (ich habe irgendwo gelesen, dass es im Leerlauf gezählt wird) zusammenzufassen, und das würde mir 100% geben, und jede einzelne Spalte könnte durch (column / 100_percent) * 100 in Prozent umgewandelt werden.

  • Benutzer: normale Prozesse, die im Benutzermodus ausgeführt werden
  • nice: vernünftige Prozesse, die im Benutzermodus ausgeführt werden
  • system: Prozesse, die im Kernel-Modus ausgeführt werden
  • Leerlauf: Daumen drehen
  • iowait: Warten auf den Abschluss der E / A
  • irq: Wartungsinterrupts
  • softirq: Wartung von Softirqs
  • stehlen: unfreiwilliges warten
  • gast: einen normalen gast führen
  • guest_nice: betreibt einen niced guest

Ist das ein praktikabler Ansatz oder bin ich total von der Strecke?

Istvan
quelle

Antworten:

11

Sie sind auf dem richtigen Weg, topnutzt diese Datei für diesen Zweck. Sie müssen es jedoch mehrmals lesen.

Die Nutzung ist ein Maß für die Nutzung im Laufe der Zeit. Sie können es einmal lesen, wenn Sie die Betriebszeit des Hosts in Sekunden kennen und dann durch diese dividieren. Dadurch erhalten Sie jedoch eine Nutzungsrate des Hosts, seit der Computer gestartet wurde.

Wenn Sie eine Rate von mehr als 5 Sekunden wünschen, würden Sie die Datei einmal lesen, 5 Sekunden schlafen, sie erneut lesen, die Differenz der Berechnungen erhalten und durch 5 dividieren.

Matthew Ife
quelle
6

Ihr Ansatz ist richtig. Sie können / proc / stat als Rohdaten verwenden und zum Beispiel rrdtool damit füttern. Ich habe mir so etwas vorgenommen, damit ich zu 100% weiß, dass es möglich ist. Sie können dann die gesamte Systemlast oder jeden Kern einzeln grafisch darstellen.

Hier ist ein Arbeitsbeispiel von mir: Bildbeschreibung hier eingeben

Reassuming -> Sie können es tun, es ist nicht schwer, nur einfache Mathematik und meine Grafiken sind ein Live-Beispiel dafür. Zum Sammeln von Daten mache ich eine Momentaufnahme von / proc / stat in einer temporären Datei auf der Ramdisk und analysiere diese Datei dann alle 1 Minute, um Daten zu sammeln.

Wie ich die Daten analysiere (Fragment eines Bash-Skripts):

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.

nachdem sie daten in die rrd datenbank bekommen haben können sie grafisch darstellen und himmel ist die grenze :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.de.html

Bartłomiej Zarzecki
quelle
Wie analysieren Sie die Daten?
Ewwhite
@ewwhite -> Ich habe meine Antwort bearbeitet, um zu zeigen, wie ich die Daten analysiere.
Bartłomiej Zarzecki
Schöne Grafiken! Bezüglich Ihrer fehlenden Spaltenanmerkung: askubuntu.com/a/120961/451886 . Wenn es in einer VM ausgeführt wird, ist es möglicherweise der "Diebstahl" -Zähler.
rkagerer
+1 für rrdtool und ramdisk!
Shadi
4

Wenn Sie oneliner möchten, sieht es möglicherweise so aus:

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

Das Ergebnis: 97.17000000000000000000

Wie es funktioniert:

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

erzeugt ( 1055057784 - 1055058055 )/100dann diesen Zeilenvorschub zu bc. Will sowas haben -7.84000000000000000000, dann wickel es einfach auf 100-$(value)und füttere bc wieder

Dort: sleep #- 1 Sekunde Verzögerung, wenn Sie diesen Wert ändern, dann sollte das Zwischenergebnis in die Anzahl der Sekunden geteilt werden. $5- 5. Feld gemäß man procund http://www.linuxhowtos.org/System/procstat.htm

Bitte lassen Sie mich wissen, wenn dies bei Ihnen nicht funktioniert.

Putnik
quelle
0

Oder wenn Sie mit nur zwei Ziffern nach dem Punkt awk zufrieden sind, können Sie alles viel einfacher und besser lesbar machen:

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