Wie protokolliere ich die Speicher- und CPU-Auslastung einer Anwendung?

16

Ähnlich wie bei Frage Wie wird die CPU-Last protokolliert? Ich möchte den Speicher eines Prozesses protokollieren.

Der Prozess, den ich protokollieren möchte, wird auf einem Remoteserver beendet und ich möchte die CPU-Auslastung und die Speicherauslastung ermitteln, kurz bevor er beendet wurde.

[aktualisieren]

Sowohl Stefano Palazzos nette kleine Pythonschrift als auch

Michałs einzeilige Ausgabewerte sind kleiner als in topfür CPU und Mem. Hast du 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
Framester
quelle
Ich kann hier leider noch keinen Kommentar abgeben, aber Sie können diesen Beitrag von Interesse finden, der erklärt, warum er pssich unterscheiden kann von top: stackoverflow.com/questions/131303/…
PM

Antworten:

16

Sie können einen Einzeiler in der Shell erstellen:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

um den Prozess mit pid = 123 zu protokollieren:

logpid 123

oder um das Protokoll zu sehen und in die Datei zu schreiben:

logpid $$ | tee /tmp/pid.log

Wenn andere Daten protokolliert werden sollen, ändern Sie die -o {this}Optionen. man psInformationen zu den verfügbaren Parametern finden Sie im Abschnitt "STANDARDFORMAT-SPEZIFIKATIONEN". Wenn Sie eine andere Zeitauflösung wünschen, ändern Sie die sleep {this}Funktion logpid().

Michał Šrajer
quelle
Einfach und macht den Job!
Rafaelbattesti
3

Wenn Sie genau hinter den topStatistiken her sind, können Sie topim Batch-Modus die PID des Prozesses angeben, nach dem Sie suchen. Nehmen Sie das Beispiel von dieser Seite ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ), wenn Sie tippten

top -b -d 10 -n 3 >> top-file

Sie müssten "top running" im Batch-Modus (-b) ausführen. Es wird alle 10 Sekunden aktualisiert, wie durch das Delay-Flag (-d) angegeben, um insgesamt 3 Iterationen (-n) zu erhalten. Die Ausgabe wird gesendet in eine Datei. " Inklusive können -pSie pidden Prozess angeben, nach dem Sie suchen . Dies wird natürlich mehr als nur CPU und RAM zurückgeben, aber es wird diese Felder enthalten. In meinem Fall würde ich zum Beispiel Folgendes erhalten, wenn ich die PID 9189 ü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
PM
quelle
Diese Seite führt zwar keine Umleitungen in eine Datei durch, führt jedoch einige raffiniertere Änderungen durch, sodass nur die CPU ausgedruckt werden kann. Wenn Sie jemanden kennen, der die Ausgabe in eine Datei umleiten und regelmäßig aktualisieren kann, ist dies für Sie von Interesse. watchscheint mir dafür nicht ideal zu sein: superuser.com/questions/281347/filtering-top-command-output
PM
2

Dieses einfache Python-Skript sollte tun, was Sie wollen:

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 zu überwachenden Programms ermitteln, bevor Sie das Skript mit der PID als Argument ausführen können:

python log.py 3912

Die CPU-Auslastung und die RAM-Auslastung werden zweimal pro Sekunde in Prozent ausgegeben:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Anschließend können Sie die Ausgabe in eine Datei umleiten, um sie später in eine Tabelle zu importieren ( python log.py 9391 > firefox_log.txt) und die Daten in eine Tabals Trennzeichen ausgewählte Tabelle zu importieren .

Das Programm wird beendet, wenn Sie Strg + C drücken oder wenn der Vorgang abgebrochen wird.

Stefano Palazzo
quelle
Lieber Stefano, vielen Dank für dein Drehbuch. Leider scheint es falsche Ergebnisse auszugeben. Hast du eine Idee warum? Bitte sehen Sie meine aktualisierte Frage.
Framester
Auf der ps-Manpage man7.org/linux/man-pages/man1/ps.1.html gibt ps die "verwendete CPU-Zeit dividiert durch die Laufzeit des Prozesses (Cputime / Realtime-Ratio) in Prozent aus "- so erhalten Sie einen Durchschnitt der CPU - Auslastung seit dem Start
Nicolas Charles