CPU-Auslastung in Echtzeit abrufen

CPU-Auslastung in Echtzeit abrufen

Wenn ich den folgenden Befehl ausführe, um die CPU-Auslastung zu ermitteln, erhalte ich „Nice + User CPU Usage“.

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

Ausgabe:

14.5

Hier habe ich das Problem, dass die Ausgabe vom obersten Befehl abhängt und sich daher nicht sofort wie beim obersten Befehl ändert. Ich bekomme also nicht sofort die richtige CPU. Es gibt dieselbe Ausgabe und sie ändert sich nicht.

Ich möchte die CPU-Auslastung in Echtzeit als Ausgabe erhalten. Bitte helfen Sie mir, meinen Befehl zu verbessern.

Antwort1

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

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

(Ohne die Verzögerung von einer Sekunde,vmstatkann nur Durchschnittswerte seit dem Booten drucken.)

Antwort2

Dies ist ein bekanntes Problem mit top. Wie erklärtHier, die 1. Iteration von top -bgibt die Prozentsätze seit dem Booten zurück, wir benötigen daher mindestens zwei Iterationen ( -n 2), um den aktuellen Prozentsatz zu erhalten. Um die Dinge zu beschleunigen, können Sie die dVerzögerung zwischen den Iterationen auf einstellen 0.01. topteilt die CPU-Auslastung zwischen Benutzer-, Systemprozessen und niceProzessen auf, wir möchten die Summe der drei. Schließlich erhalten Sie grepdie Zeile mit den CPU-Prozentsätzen und verwenden dann, gawkum Benutzer-, System- und Nice-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

Antwort3

Ich habe verschiedene Möglichkeiten ausprobiert, aber diese 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 vonHier

Antwort4

Ich benötigte die CPU-Auslastung pro Kern und verwendete mpstat aus dem Sysstat-Paket.

sudo apt install sysstat

CPU0-Auslastung in %:

echo 100 - $(mpstat -P 0 | tail -1 | awk '{print $13}') | bc

CPU1-Auslastung in %:

echo 100 - $(mpstat -P 1 | tail -1 | awk '{print $13}') | bc

Ändern Sie -PX, wenn Sie mehr als 2 Kerne haben.

verwandte Informationen