Wie protokolliert man die Speicher- und CPU-Auslastung einer Anwendung?

Wie protokolliert man die Speicher- und CPU-Auslastung einer Anwendung?

Ä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 topfü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 pszu 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 topStatistiken haben möchten, können Sie sie im Batch-Modus ausführen topund 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 -pangeben, pidnach 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 Tabals 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

CPU vs. RSS-Diagramm

verwandte Informationen