Immer die gleiche CPU-Auslastung.

13

Wenn ich den folgenden Befehl ausführe, um die CPU-Auslastung zu ermitteln, erhalte ich eine nette + Benutzer-CPU-Auslastung.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Ausgabe:

14.5

Hier bekomme ich das Problem, dass die Ausgabe vom obersten Befehl abhängt und sich daher nicht sofort als oberster Befehl ändert. Ich bekomme also nicht sofort die richtige CPU. Es gibt die gleiche Ausgabe und ändert sich nicht.

Ich möchte eine Echtzeit-CPU in der Ausgabe erhalten. Bitte helfen Sie mir, mein Kommando zu verbessern.

Ketan Patel
quelle
1
Und die Frage ist?
Dennis Kaarsemaker
Versuchen Sie, den mit vorangestellten Befehl auszuführen time. Auf meinem System dauert es nur 0.165s.
Depquid
Bitte gib mir einen bearbeiteten Befehl.
Ketan Patel
Versuchen Sie:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid
Keine Unterschiede in der Ausgabe, nachdem in verschiedenen Systemen getestet
Ketan Patel

Antworten:

13

Sie haben recht, topscheint bei der ersten Iteration eine inkorrekte CPU-Auslastung zu verursachen. Sie können dieses Problem folgendermaßen umgehen:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Dies wird natürlich doppelt so lange dauern, aber es wird trotzdem funktionieren.

Wenn Sie dennoch möchten, dass es schneller funktioniert, können Sie die -dOption verwenden, z. B. für eine Gesamtmessdauer von 1 Sekunde die Hälfte davon:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Ruslan
quelle
serverfault.com/a/436499/134517 Außerdem wird es mehr als doppelt so lange dauern, da es ungefähr eine Sekunde dauert, anstatt fast keine.
Altendky
Zusätzlich zu dem Kommentar von altendky finden Sie in der Antwort von terdon eine Erklärung, warum das Problem überhaupt besteht.
Ruslan
6

Technisch gesehen gibt der erste topnicht immer den gleichen Wert aus. Es wird nur die durchschnittliche CPU-Last seit dem letzten Start ausgegeben. Da zur Berechnung der CPU-Auslastung topdas Delta der /proc/statStatistiken verwendet wird, wird der erste Wert beim Vergleich mit Null berechnet, was zu einem falschen (aber WAD-) Ergebnis führt.

Wenn Sie nicht verwenden möchten top, können Sie Folgendes direkt analysieren /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

Auf diese Weise ist es auch schneller und genauer.

Sie können es testen mit stress:

stress -c 1 -q &

Und TU

killall stress

nach.


quelle
Nett. Und wenn Ihr Befehl in einer Datei mit dem Namen "cpu" abgelegt ist, watchkann er ausgeführt werden:watch -n1 "bash ./cpu"
Brent Faust
Ihr awk-Skript zum Parsen /proc/statist ziemlich cool, hat aber anscheinend den gleichen Nachteil wie die erste Iteration von top: Es gibt die durchschnittliche CPU-Last seit dem letzten Start aus, nicht die aktuelle.
Pieroxy
5

Um die Antwort von @ Ruslan zu erweitern und die topCPU-Auslastung zwischen Benutzern, Systemprozessen und niceProzessen aufzuteilen, wollen wir die Summe der drei. So können wir topim bAtch-Modus arbeiten, der es uns ermöglicht, die Ausgabe zu analysieren. Wie hier erläutert , gibt die erste Iteration der top -bWerte die Prozentsätze seit dem Start zurück. Daher benötigen wir mindestens zwei Iterationen ( -n 2), um den aktuellen Prozentsatz abzurufen. Um die Dinge zu beschleunigen, können Sie die dVerzögerung zwischen den Iterationen auf Folgendes einstellen 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
terdon
quelle
4

Vielleicht verwenden Sie diese basierend auf der psAusgabe:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }
Ghugo
quelle
0

Verwenden Sie den Befehl watch oder for loop in shell.

dh watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"

Gänseblümchen
quelle
Dasselbe passiert mit der Uhr
Ketan Patel
0

Warum interessiert Sie die CPU-Auslastung? Der Lastdurchschnitt ist ein viel besserer Indikator:

cat /proc/loadavg

Wenn Sie die CPU-Auslastung wirklich benötigen, /proc/statist das Parsen wahrscheinlich der richtige Weg.

Martin von Wittich
quelle
1
Der Lastdurchschnitt ist im Wesentlichen ein Zeitintegral der CPU-Auslastung (geteilt durch die Zeit). Warum ist ein integrales Merkmal ein viel besserer Indikator [für alles] als ein differenzielles Merkmal, wenn es völlig unterschiedliche Anwendungsfälle gibt? Gibt /proc/statauch die CPU-Auslastung nicht so an, wie sie ist, man muss sie zweimal mit etwas Zeit zwischen den Lesevorgängen lesen und einige Berechnungen durchführen, um die CPU-Auslastung zu ermitteln. Genau das toptut es.
Ruslan
Ich kann nicht rechnen, daher muss ich zugeben, dass ich den Unterschied zwischen Integral und Differential nicht wirklich verstehe: / "Der Lastdurchschnitt ist im Grunde genommen ein Zeitintegral der CPU-Auslastung" - oder? AFAIK Ein Prozess, der im Status D hängt, verursacht eine Erhöhung der Auslastung, aber keine CPU-Auslastung. "Warum würdest du sagen ..." - OP sagt nicht, was er wirklich erreichen will. Um ehrlich zu sein, gehe ich nur davon aus, dass er seine Systemlast messen möchte und dachte, dass die CPU-Auslastung der beste Indikator dafür wäre , also habe ich ihn angewiesen, durchschnittlich zu laden.
Martin von Wittich
Aus Ihrem Link: "Systeme berechnen den Lastdurchschnitt als den exponentiell gedämpften / gewichteten gleitenden Durchschnitt der Lastzahl." und "die Systemlast ist ein Maß für den Umfang der Rechenarbeit". D Zustand nimmt keine Rechenarbeit. Was benötigt wird, sind die Prozesse, die CPU-Zeit verbrauchen. Die durchschnittliche Auslastung entspricht also im Wesentlichen dem Prozentsatz der Zeit, in der die CPU für einen bestimmten Zeitraum nicht im Leerlauf war (z. B. Minuten bis Zehn Minuten). Die CPU-Auslastung ist der Prozentsatz der Zeit, in der die CPU im Millisekundenbereich nicht im Leerlauf ist - dh, sie wird jedes Mal aktualisiert, wenn Sie sie lesen und den aktuellen Status wiedergeben.
Ruslan
-2

Mit sarBefehl

sar 1 10

Das heißt: Erhalte 10-mal das Ergebnis pro Sekunde

Philip Ngun
quelle