CPU-Nutzung in Echtzeit


11

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

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

Ausgabe:

14.5

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

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



Dieses einfache Bash-Skript macht genau das: askubuntu.com/a/450136/243213
Craig van Tonder

Antworten:


19

Wenn Sie sich eine Verzögerung von einer Sekunde leisten können, wird die CPU-Auslastung als einfacher Prozentsatz gedruckt:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Ohne die Verzögerung von einer Sekunde vmstatkönnen nur Durchschnittswerte seit dem Start gedruckt werden.)


Gibt mir kein genaues% (im Vergleich zu htop)
Lepe

1
Sie müssen Folgendes verwenden vmstat 1 2: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] Andernfalls werden Sie seit dem Bootenvmstat Werte angeben, nach denen Sie wahrscheinlich nicht suchen.
Joe

Joe, danke, es funktioniert. Bitte Paul, bearbeiten Sie die Antwort so, dass jeder die richtige Befehlszeile sehen kann
Pavlos Theodorou

Danke, dass du das verstanden hast, Joe und Pavlos! Ich habe diesen Teil der Manpage nicht bemerkt.
Paul

9

Dies ist ein bekanntes Problem mit top. Wie hier erläutert , gibt die erste Iteration von top -bdie Prozentsätze seit dem Start zurück. Daher benötigen wir mindestens zwei Iterationen ( -n 2), um den aktuellen Prozentsatz zu erhalten. Um die dArbeit zu beschleunigen, können Sie die Verzögerung zwischen den Iterationen auf einstellen 0.01. topteilt die CPU-Auslastung zwischen Benutzer, Systemprozessen und niceProzessen auf, wir wollen die Summe der drei. Schließlich geben Sie grepdie Zeile mit den CPU-Prozentsätzen ein und verwenden dann, gawkum Benutzer-, System- und nette Prozesse zu summieren:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

Jede andere Methode, einschließlich sar, mpstat ... usw., zeigt 2/3%, während dieser Befehl immer 50% anzeigt.
CMCDragonkai

@CMCDragonkai die Zahlen sollten sich ändern (ich habe es gerade überprüft) Sind Sie sicher, dass Sie es richtig kopiert / eingefügt haben? Beachten Sie außerdem, dass auf Systemen mit mehreren CPUs topdie prozentuale Auslastung als Prozentsatz einer einzelnen CPU angegeben wird. Dies bedeutet, dass Sie häufig viel höhere Prozentsätze erhalten. Siehe Punkt 9 hier .
Terdon

Ich denke, dieser Befehl ist möglicherweise nicht mit meinem System kompatibel. Aber es ist offensichtlich, dass alle anderen Methoden, die ich ausprobiert habe, einen Prozentsatz von 1/2 / 3% ergeben, was ich sehe, wenn ich htop ausführe, während dieser Befehl mir eine Anomalie gibt.
CMCDragonkai

@CMCDragonkai das liegt an den mehreren CPUs. Sie können entweder die dadurch zurückgegebene Zahl erhalten und durch die Anzahl der Kerne dividieren oder Sie können sie topim interaktiven Modus verwenden (einfach ausführen top) und dort drücken I(Umschalt + i), um eine Aufteilung nach Kernen anzuzeigen.
Terdon

Ich habe nur 1 CPU.
CMCDragonkai

7

Ich habe verschiedene Möglichkeiten ausprobiert, aber dies scheint mir die genaueste zu sein:

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)}'

Habe es von hier bekommen


Mein Linux (Linux-Maschinenname 4.4.0-127-generic # 153-Ubuntu SMP Sa 19. Mai 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) hat keine Spalte $ 15 (CPU-Zeile der Datei / proc / stat) : CPU 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou

1
Beste Antwort! Vielen Dank! Meine Variation: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp

Der Unterschied zu maXp besteht darin, dass der Druck mit einer einzigen Dezimalstelle gerundet wird: Dies ist %.1fmeiner Meinung nach besser lesbar und nützlich, wenn Sie diese Ausgabe in anderen Skripten verwenden.
Lepe

0

Verwenden Sie -n2. Dies gibt zwei Zeilen aus. Beim ersten topAusdruck der Zeile ist die Zeile zu diesem Zeitpunkt nicht für den Status qualifiziert. Passen Sie dann Ihr Skript an, um die erste Zeile zu ignorieren.

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.