Ähnlich wie FrageWie protokolliere ich die CPU-Auslastung?, ich möchte den Speicher eines Prozesses protokollieren.
Der Prozess, den ich protokollieren möchte, wird auf einem Remote-Server beendet und ich möchte die CPU-Auslastung und die Speichernutzung unmittelbar vor der Beendigung herausfinden.
[aktualisieren]
Sowohl Stefano Palazzos hübsches kleines Python-Skript als auch
Michałs einzeilige Ausgabewerte sind top
für CPU und Mem kleiner als in. Haben Sie eine Idee, warum?
Ausgabe oben:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2312 schXX 20 0 1241m 328m 58m S 100 0.3 11:56.68 MATLAB
Ausgabe des Python-Skripts von Stefano Palazzo:
python memlogger.py 2312
%CPU %MEM
76.00 0.20
76.00 0.20
Antwort1
Sie können in der Shell einen Einzeiler erstellen:
logpid() { while sleep 1; do ps -p $1 -o pcpu= -o pmem= ; done; }
um den Prozess mit pid=123 zu protokollieren, einfach:
logpid 123
oder um das Protokoll anzuzeigen und in eine Datei zu schreiben:
logpid $$ | tee /tmp/pid.log
Wenn Sie möchten, dass andere Daten protokolliert werden, ändern Sie -o {this}
die Optionen. Informationen man ps
zu den verfügbaren Parametern finden Sie im Abschnitt „STANDARDFORMATSPEZIFIKATOREN“. Wenn Sie eine andere Zeitauflösung wünschen, ändern Sie sleep {this}
die Funktion logpid()
.
Antwort2
Wenn Sie genau die top
Statistiken haben möchten, können Sie sie im Batch-Modus ausführen top
und dabei die PID des gewünschten Prozesses angeben. Nehmen wir das Beispiel von dieser Seite (http://www.dedoimedo.com/computers/linux-cool-hacks.html), wenn Sie eingegeben haben
top -b -d 10 -n 3 >> top-file
Sie würden „top im Batch-Modus (-b) laufen lassen. Es wird alle 10 Sekunden aktualisiert, wie durch das Flag delay (-d) angegeben, für insgesamt 3 Iterationen (-n). Die Ausgabe wird an eine Datei gesendet.“ Sie können auch den Prozess -p
angeben, pid
nach dem Sie suchen. Dies gibt natürlich mehr als nur CPU und RAM zurück, aber es enthält diese Felder. In meinem Fall würde ich beispielsweise Folgendes erhalten, wenn ich PID 9189 mit überwache top -b -d 10 -n 3 -p 9189 >> ~/top-file
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9189 pmj27 20 0 1617016 808112 27916 S 0.0 0.3 1:36.63 gedit
Antwort3
Dieses einfache Python-Skript sollte tun, was Sie möchten:
import time
import string
import sys
import commands
def get_cpumem(pid):
d = [i for i in commands.getoutput("ps aux").split("\n")
if i.split()[1] == str(pid)]
return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None
if __name__ == '__main__':
if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
print("usage: %s PID" % sys.argv[0])
exit(2)
print("%CPU\t%MEM")
try:
while True:
x,y = get_cpumem(sys.argv[1])
if not x:
print("no such process")
exit(1)
print("%.2f\t%.2f" % (x,y))
time.sleep(0.5)
except KeyboardInterrupt:
print
exit(0)
Sie müssen zuerst die Prozess-ID des Programms herausfinden, das Sie überwachen möchten. Dann können Sie das Skript mit der PID als Argument ausführen:
python log.py 3912
Zweimal pro Sekunde wird die CPU- und RAM-Auslastung in Prozent ausgedruckt:
%CPU %MEM
0.90 0.40
1.43 0.40
8.21 0.40
...
Sie können die Ausgabe dann in eine Datei umleiten, um sie später in eine Kalkulationstabelle zu importieren ( python log.py 9391 > firefox_log.txt
) und die Daten in eine Kalkulationstabelle importieren und dabei Tab
als Trennzeichen auswählen.
Das Programm wird beendet, wenn Sie Strg+C drücken oder wenn der Prozess beendet wird.
Antwort4
Procpathkann verwendet werden, um Procfs-Metriken einer Anwendung (Prozessbäume) aufzuzeichnen, einschließlich CPU-Auslastung und Resident Set Size (RSS). Vollständige Offenlegung: Ich habe es geschrieben.
Nehmen wir Firefox als Beispiel. Auf meinem Rechner sieht sein Prozessbaum folgendermaßen aus:
/usr/lib/firefox/firefox
├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
└─ /usr/lib/firefox/firefox -contentproc -childID 8 ...
Mit Procpath können Sie Prozessmetriken aus diesem Baum wie folgt sammeln (und sehendie Dokumentationwenn Sie den Prozess-Supervisor Ihrer Zuweisung, beispielsweise systemd oder Docker, nach der Root-PID fragen möchten):
procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'
Mit diesem Befehl sammelt und zeichnet Procpath die Procfs-Metriken dieses Baums alle 10 Sekunden auf. Sie können es in einem Terminal-Multiplexer (wie Byobu) laufen lassen, um es im Hintergrund auf Ihrem Server auszuführen.
Wenn Ihre Anwendung erneut abstürzt, können Sie mit diesem Befehl die CPU-Auslastung und die Resident Set-Größe der Anwendung visualisieren.
procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer