8 Stimmen

Erhalten Sie die CPU-Auslastung im Shell-Skript?

Ich führe einige JMeter-Tests gegen einen Java-Prozess durch, um zu bestimmen, wie reaktionsschnell eine Webanwendung unter Last (500+ Benutzer) ist. JMeter wird die Antwortzeit für jede Webanfrage anzeigen, und ich habe ein Skript geschrieben, um alle X Sekunden den Tomcat Manager anzupingen, um die aktuelle Größe des JVM-Heap zu erhalten.

Ich möchte Statistiken zum Server darüber sammeln, wie viel % der CPU von Tomcat verwendet wird. Ich habe versucht, dies in einem Shell-Skript mit ps wie folgt zu tun:

PS_RESULTS=`ps -o pcpu,pmem,nlwp -p $PID`

...das Kommando alle X Sekunden ausführen und die Ergebnisse an eine Textdatei anhängen. (für alle Neugierigen, pmem = % Speicherauslastung und nlwp ist die Anzahl der Threads)

Ich habe jedoch festgestellt, dass dies eine andere Definition von "% der CPU-Auslastung" liefert, als ich möchte - gemäß den Manpages für ps wird pcpu wie folgt definiert:

CPU-Auslastung des Prozesses im Format "##.#". Es ist die verwendete CPU-Zeit geteilt durch die Zeit, die der Prozess ausgeführt wurde (cputime/realtime-Verhältnis), ausgedrückt als Prozent.

Mit anderen Worten, pcpu gibt mir die % CPU-Auslastung des Prozesses für die gesamte Lebensdauer des Prozesses.

Da ich alle X Sekunden eine Stichprobe nehmen möchte, möchte ich die CPU-Auslastung des Prozesses nur zum aktuellen Zeitpunkt erfassen - ähnlich wie das, was top mir geben würde (CPU-Auslastung des Prozesses seit dem letzten Update).

Wie kann ich dies in einem Shell-Skript erfassen?

13voto

Ben Collins Punkte 20125

Verwenden Sie top -b (und andere Schalter, wenn Sie unterschiedliche Ausgaben möchten). Es wird einfach auf stdout anstatt in ein Curses-Fenster dumpen.

6voto

Tim Punkte 6681

Das nützlichste Werkzeug, das ich beim Überwachen eines Servers während eines Tests wie JMeter gefunden habe, ist dstat. Es gibt Ihnen nicht nur eine Vielzahl von Statistiken vom Server aus, sondern gibt sie auch im CSV-Format aus, um sie leicht in eine Tabellenkalkulation zu importieren, und ermöglicht es Ihnen, das Werkzeug mit in Python geschriebenen Modulen zu erweitern.

4voto

Bilzard Punkte 373

Benutzerlast: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $2}' |sed 's/.[^.]*$//' Systemlast: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $3}' |sed 's/.[^.]*$//' Leerlauflast: top -b -n 1 |grep Cpu |tail -n 1 |awk '{print $5}' |sed 's/.[^.]*$//'

Jedes Ergebnis ist eine runde Dezimalzahl.

2voto

Adam Wright Punkte 48270

Vom Kopf würde ich die /proc-Dateisystemansicht des Systemzustands verwenden - Schauen Sie sich man 5 proc an, um das Format des Eintrags für /proc/PID/stat zu sehen, der Informationen zur Gesamtnutzung der CPU enthält, und verwenden Sie /proc/stat, um globale Systeminformationen zu erhalten. Um die "aktuelle Zeit" Nutzung zu erhalten, meinen Sie wahrscheinlich wirklich "CPU, die in den letzten N Sekunden verwendet wurde"; Nehmen Sie zwei Proben in kurzem Abstand, um die aktuelle Rate des CPU-Verbrauchs zu sehen. Sie können dann diese Werte in etwas Brauchbares verwandeln. Aber wirklich, das ist wahrscheinlich eher eine Aufgabe für Perl/Ruby/Python als für ein reines Shell-Skript.

Sie könnten die groben Daten, nach denen Sie suchen, mit /proc/PID/status erhalten, was einen Schlafdurchschnitt für den Prozess angibt. Ziemlich grobe Daten allerdings.

0voto

mighq Punkte 944

Verwenden Sie auch 1 als Iterationsanzahl, so erhalten Sie einen aktuellen Schnappschuss, ohne auf einen weiteren im $delay-Zeit warten zu müssen.

top -b -n 1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X