Ich führe einige JMeter -Tests mit einem Java-Prozess durch, um festzustellen, wie schnell eine Webanwendung unter Last reagiert (500+ Benutzer). JMeter gibt die Reaktionszeit für jede Webanforderung an und ich habe ein Skript geschrieben, das den Tomcat Manager alle X Sekunden anpingt, wodurch ich die aktuelle Größe des JVM-Heaps bekomme.
Ich möchte auf dem Server Statistiken über den Prozentsatz der von Tomcat verwendeten CPU sammeln. Ich habe versucht, es in einem Shell-Skript mit ps
wie folgt zu tun:
... Ausführen des Befehls alle X Sekunden und Anhängen der Ergebnisse an eine Textdatei. (Für alle, die sich fragen, pmem
=% mem usage und nlwp
ist die Anzahl der Threads)
Ich habe jedoch festgestellt, dass dies eine andere Definition von "% der CPU-Auslastung" ergibt, als ich möchte - entsprechend den Manpages für ps ist pcpu
definiert als:
CPU-Auslastung des Prozesses im Format "##. #". Es ist die verwendete CPU-Zeit geteilt durch die Zeit, die der Prozess abgelaufen ist (cputime / realtime ratio), ausgedrückt in Prozent.
Mit anderen Worten, pcpu
gibt mir die% CPU-Auslastung für den Prozess für die Lebensdauer des Prozesses.
Da ich alle x Sekunden ein Beispiel nehmen möchte, möchte ich nur die CPU-Auslastung des Prozesses zur aktuellen Zeit sammeln - ähnlich wie es top
mir geben würde
(CPU-Auslastung des Prozesses seit dem letzten Update)
Wie kann ich das in einem Shell-Skript erfassen?
Verwenden Sie top -b
(und andere Schalter, wenn Sie unterschiedliche Ausgaben wünschen). Es wird einfach in stdout gespeichert, anstatt in ein Fluchfenster zu springen.
Das nützlichste Tool, das ich für die Überwachung eines Servers während der Durchführung eines Tests wie JMeter gefunden habe, ist dstat . Es gibt Ihnen nicht nur eine Reihe von Statistiken vom Server, es gibt sie für den einfachen Import in eine Tabellenkalkulation an csv aus und Sie können das Tool um Module erweitern, die in Python geschrieben sind.
Benutzer laden: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print }' |sed 's/.[^.]*$//'
Systemlast: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print }' |sed 's/.[^.]*$//'
Leerlauflast: top -b -n 1 |grep Cpu |tail -n 1 |awk '{print }' |sed 's/.[^.]*$//'
Jedes Ergebnis ist eine runde Dezimalzahl.
Von meinem Kopf aus würde ich die / proc-Dateisystemansicht des Systemstatus verwenden - Schauen Sie sich man 5 proc an, um das Format des Eintrags für / proc / PID / stat zu sehen , die Informationen zur gesamten CPU-Auslastung enthält und / proc / stat zum Abrufen globaler Systeminformationen verwendet. Um "aktuelle Zeit" zu erhalten, meinen Sie wahrscheinlich "CPU in den letzten N Sekunden"; nehmen Sie zwei Abtastungen kurz hintereinander, um die aktuelle Rate des CPU-Verbrauchs zu sehen. Sie können diese Werte dann in etwas Nützliches umwandeln. Wirklich, das ist wahrscheinlich eher ein Perl / Ruby / Python-Job als ein reines Shell-Skript.
Sie können möglicherweise mit / proc / PID / status nach den ungefähren Daten suchen, die Sie benötigen, um einen Sleep-Durchschnitt für den Prozess zu erhalten. Ziemlich grobe Daten obwohl.