So erhalten Sie die gesamte CPU-Auslastung (z. B. 57%) unter Linux [geschlossen]


193

Ich frage mich, wie Sie die CPU-Auslastung des Systems ermitteln und beispielsweise mit Bash in Prozent darstellen können.

Beispielausgabe:

57%

Wenn es mehr als einen Kern gibt, wäre es schön, wenn ein durchschnittlicher Prozentsatz berechnet werden könnte.


1
@julesanchez der Wert muss woanders weitergeleitet werden, daher muss es ein int
user1199739

tun top> myfile.txt Und das Anwenden Ihres Filters in der Nachbehandlung ist nicht in Ordnung?
JuSchz

11
Ein Befehl, der kein System erfordert:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
Wiedereröffnung Ich verstehe nicht, warum dies als nicht thematisch eingestuft wurde. Könnten diejenigen, die es geschlossen haben, bitte näher darauf eingehen?
Jonathan H

3
Mein Verständnis von /proc/statist sehr begrenzt, aber dieser Einzeiler funktioniert gut genug für mich : cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Mit% .2f können Sie die Anzahl der Dezimalstellen steuern, die Sie ausgeben möchten, und mit% sleep 1die Zeit einstellen, über die Sie den Durchschnitt bilden möchten, dh wenn es das tut, was ich denke, dass es tut. Sie können es in eine Bash-While-Schleife setzen, um es in Echtzeit zu testen.
Yeti

Antworten:


174

Schau es dir an cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

BEARBEITEN Bitte lesen Sie die Kommentare, bevor Sie diese kopieren, einfügen oder für ernsthafte Arbeiten verwenden. Dies wurde weder getestet noch verwendet. Es ist eine Idee für Leute, die kein Dienstprogramm installieren möchten oder für etwas, das in einer Distribution funktioniert. Einige Leute denken, Sie können alles "apt-get install".

ANMERKUNG: Dies ist nicht die aktuelle CPU-Auslastung, sondern die gesamte CPU-Auslastung in allen Kernen seit dem Systemstart. Dies kann sich stark von der aktuellen CPU-Auslastung unterscheiden. Um den aktuellen Wert zu erhalten, muss top (oder ein ähnliches Werkzeug) verwendet werden.

Die aktuelle CPU-Auslastung kann möglicherweise berechnet werden mit:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
Sie müssen jedoch mpstat wie oben empfohlen installieren. Viele Menschen haben diese Flexibilität nicht. cat / proc / stat dann Pipe ist viel einfacher als mpstat, das Sie empfehlen.
Vimdude

12
+1 Verstehe nicht, warum das Parsen eines anderen Dienstprogramms besser ist als das Parsen/proc/stat
Monica wieder herstellen Bitte

9
System + Benutzer + Leerlauf = 100%. Also vielleicht so etwas wie: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude

106
Ich denke, dass diese Lösung nicht die aktuelle CPU-Auslastung anzeigt, sondern die durchschnittliche CPU-Auslastung seit dem Start der CPU.
Etienne

11
@jlliagre, ja das stimmt. Um die aktuelle CPU-Auslastung zu berechnen, die nicht durchschnittlich ist, müssen Sie einen Wert von 1 USD nehmen, dann verzögern, dann einen Wert von 1 USD nehmen und den Unterschied sehen. Das ist die aktuelle CPU-Auslastung.
Vimdude

102

Du kannst es versuchen:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Jedes Mal, wenn ich diesen Befehl ausführe, erhalte ich genau die gleiche Ausgabe ( 32.7%).
Alanaktion

13
Ein genaueres Ergebnis wird angegeben, wenn ich es verwende top -bn2, aber es dauert lange. Nach dem, was ich gelesen habe, scheint dies der einzige Weg zu sein, um ein genaues Ergebnis zu erzielen.
Alanaktion

6
top -bn1scheint auf meinem FC20-System sehr ungenau zu sein. top -bn2scheint gut zu funktionieren.
Martin Tournoij

23
Der Befehl in dieser Antwort scheint für Systeme geschrieben zu sein, auf denen top -vzurückgegeben wird procps-ng(z. B. Fedora). Es gibt auch procpsz. B. Ubuntu und CentOS, wo der Befehl nicht funktioniert (zeigt immer 100% an, da das Parsen fehlschlägt, weil die CPU-Zahlen unterschiedlich formatiert sind). Hier ist eine Version, die mit beiden Implementierungen funktioniert:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
Randnotiz: Verwenden Sie unter OSX Folgendes : top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0

38

Versuchen Sie es mpstataus dem sysstatPaket

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Dann einige cutoder grepum die Informationen zu analysieren, die Sie benötigen:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
Ich glaube nicht, dass dies die gesamte CPU
anzeigt

Ich würde sagen, es ist 100% Leerlauf, das ist die gesamte CPU-Auslastung (in%)
Peter Svensson

Das ist der Prozentsatz "nicht" verwendet. Diese Antwort war gut, bis zum grep | Schwanz | awk Teil ...
Jordanm

Ich würde den awkTeil in: ändern awk -F " " '{print (100 - $12)"%"}', wodurch die Ausgabe so formatiert wird, wie er es wollte, aber ansonsten sieht das für mich gut aus.
Dan Fego

1
@ Jordanm Alle Wahrheiten; Ich habe mehr darüber abgestimmt, weil es funktioniert. Ich würde das persönlich tun:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Könnte auch eine tatsächliche Antwort mit meiner Lösung liefern, die von Peter Liljenbergs inspiriert wurde:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Dies wird verwendet awk, um 100 minus dem 12. Feld (Leerlauf) mit einem Prozentzeichen danach auszudrucken. awkwird dies nur für eine Zeile tun, in der das 12. Feld nur Zahlen und Punkte enthält ( $12 ~ /[0-9]+/).

Sie können auch fünf Proben im Abstand von einer Sekunde mitteln:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Testen Sie es so:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
Es ist besser, "mpstat 2 1 | ..." auszuführen, damit die Statistiken für die letzte 1 Sekunde angezeigt werden. Ansonsten zeigt mpstat standardmäßig Statistiken von Anfang an an und das ändert sich im Laufe der Zeit nicht viel
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9.‹+/ {print 100 - $ 11"% "}'" diese Arbeit für mich.
AloneInTheDark

@ Sarang Vielen Dank !! Endlich kann ich auch die angezeigten Ergebnisse erhalten conky. Leider ist diese Zeile SEHR langsam und dauert fast eine ganze Sekunde, um ausgeführt zu werden.
Syntaxfehler

6
@syntaxerror Es dauert genau 2 Sekunden, denn wenn Sie sich den Befehl ansehen, sehen Sie, dass das erste Argument das Intervall ist, aber aufgrund des zweiten Arguments nur einmal ausgeführt wird, sodass es 2 volle Sekunden wartet, bis das Ergebnis zurückgegeben wird.
Johan Bjäreholt

Die Frage ist geschlossen, also habe ich meine (ähnliche) Antwort zu deiner hinzugefügt :-) Ich hoffe, es macht dir nichts aus. Wie Sie hat mich auch die Antwort von Peter Liljenberg inspiriert.
PJ Brunet

16

BEARBEITET: Ich habe festgestellt, dass in der Antwort eines anderen Benutzers% idle Feld 12 anstelle von Feld 11 war. Das awk wurde aktualisiert, um zu berücksichtigen, dass das Feld% idle variabel ist.

Dies sollte Ihnen die gewünschte Ausgabe bringen:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Wenn Sie eine einfache Ganzzahlrundung wünschen, können Sie printf verwenden:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'funktioniert super für mich, danke. Beachten Sie die mpstat 1 1, um sicherzustellen, dass die CPU-Auslastung über eine Sekunde abgetastet wird
chrishiestand

1
Wenn Sie jq haben:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
Nyet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.