Wie kann ich top-ähnliche CPU-Statistiken von der Shell erhalten?

12

Ich versuche, eine genaue Anzeige meiner verwendeten CPU (in Prozent) von zu erhalten top. Dies ist der Befehl, den ich zum Testen ausführe:

top -n1 | awk '/Cpu\(s\):/ {print $2}'

Dies ergibt:

10.7%us,

Welches ist das richtige Stück von Daten, die ich will. Jedes Mal, wenn ich den Befehl ausführe, erhalte ich jedoch die gleiche Ausgabe, obwohl mein System unterschiedlich belastet wird (und ganz zu schweigen htopdavon, dass meine Verwendung anders ist). Es scheint, dass topmeine CPU-Auslastung bei jedem Start gleich ist. Erst nach ein paar Frames werden mir die richtigen Werte angezeigt.

Es scheint nicht so, als ob ich die Ausgabe von top auf diese Weise analysieren kann. Deshalb suche ich nach anderen zuverlässigen Anwendungen, die mir ein genaues Ablesen der Shell ermöglichen. Ich mag es wirklich, wie htopich eine pro-Kern-Lesung geben kann.

Ich habe es versucht iostatund mpstataber sie scheinen ungenaue und "langsam zu ändernde" Werte zu geben.

n0pe
quelle
2
Nicht. Die richtige Frage ist: Wie erhalte ich Statistiken zur CPU-Auslastung von der Shell?
Stéphane Gimenez
@ StéphaneGimenez danke Ich habe meine Frage geändert
Nr.

Antworten:

12

Ich benutze dieses Skript (aus diesem Thread auf den Arch Boards ):

#!/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
jasonwryan
quelle
Linux hat einige großartige Informationen in / proc / - siehe linux.die.net/man/5/proc für alle Goodies. Beachten Sie nur, dass dies nur Linux ist. Es gibt wirklich keine plattformübergreifende Möglichkeit, diese Informationen abzurufen, es sei denn, Sie verwenden eine Bibliothek wie Sigar .
Pat Notz
Die Idee ist gut, aber einige Details sind falsch. Der Leerlaufwert ist die 5. Spalte, und Sie sollten auch die iowait-Spalte (6. Spalte) hinzufügen, um einen angemessenen Prozentsatz zu erhalten. Um völlig korrekt zu sein, müssten Sie auch alle "Rest" -Werte addieren, aber diese sind oft sehr klein.
Peter Eisentraut
Der Leerlaufwert ist die fünfte Spalte, wenn Sie die Spalte "cpu" zählen. Ansonsten ist es das vierte.
SunSparc
6

Schauen Sie sich auch sar an . Die Implementierungen können von nix zu nix sehr unterschiedlich sein, es sollten jedoch grundlegende Systemstatistiken zu bestimmten Snapshots angezeigt werden. Ich bin nicht sicher , wie genau die Werte an dem Punkt sind , an dem der Befehl zuerst initialisiert wird, aber Sie könnten spielen , um zu sehen , wie sie im Vergleich zu top, iostatusw.

Die Ausgabe ist wie oben spaltenbasiert, sodass Sie in der Lage sein sollten, die Ausgabe an die Ergebnisse weiterzuleiten awkoder diese cutzu bearbeiten.

tcdyl
quelle
Ich habe es sarvorher mit gemischten Ergebnissen versucht . Ich werde hier auf die Antwort von @ jasonwryan eingehen, da ich sie leicht so ändern kann, dass sie die Verwendung mit beiden meiner CPU-Kerne widerspiegelt.
Nr.
0

Was ich gefunden habe, ähnelt der Person, die die obige Frage gestellt hat, zumindest unter CentOS 6. Wenn ich im Batch-Modus nur eine Iteration lang top laufen lasse, scheint es die gleiche Zahl zu sammeln, fast so, als ob seine Tendenz darin besteht, mit was zu beginnen es erinnert sich zuletzt an die Anzeige. Top muss anscheinend mindestens ein paar Zahlen akkumulieren, damit Deltas die richtigen Prozentsätze liefern. Nachdem ich über 10 Iterationen getestet hatte, stellte ich fest, dass die zweite Zahl, die auftauchte, bei jedem Lauf eine ausreichende Differenzierung aufwies. Also, es ist einfach genug, um diese Leitung über zu bekommen

top -b -n 2 | grep Cpu | tail -1

Ich mag es, dies mit der Betriebszeit für das Laden und einem Grep-Filter für ausgewählte Prozesse aus ps, wie z. B. Postgres-Abfragen, zu integrieren. Ein sehr einfacher Monitor kann mit dem Alias ​​ausgedrückt werden:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"
Robert Casey
quelle