
Ich möchte die Speicher-/CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich wie, top
aber nur auf einen Prozess ausgerichtet, vorzugsweise mit einer Art Verlaufsdiagramm.
Antwort1
Unterstützt unter Linux top
tatsächlich die Konzentration auf einen einzelnen Prozess, obwohl natürlich kein Verlaufsdiagramm vorhanden ist:
top -p PID
Dies ist auch unter Mac OS X mit einer anderen Syntax verfügbar:
top -pid PID
Antwort2
Procpath
2020 Update (nur Linux/procfs). Da ich mich häufig genug mit dem Problem der Prozessanalyse befasse und mit den unten beschriebenen Lösungen nicht zufrieden bin, habe ich beschlossen, Folgendes zu schreiben:mein eigenes. Es handelt sich um ein reines Python-CLI-Paket, einschließlich einiger Abhängigkeiten (kein umfangreiches Matplotlib), das potenziell viele Metriken aus procfs darstellen kann, JSONPath-Abfragen an den Prozessbaum ermöglicht, über grundlegende Dezimierung/Aggregation (Ramer-Douglas-Peucker und gleitender Durchschnitt), Filterung nach Zeiträumen und PIDs und einige andere Dinge verfügt.
pip3 install --user procpath
Hier ist ein Beispiel mit Firefox. Dies zeichnet alle Prozesse mit „Firefox“ in ihrer cmdline
(Abfrage durch eine PID würde so aussehen '$..children[?(@.stat.pid == 42)]'
) 120 Mal auf, einmal pro Sekunde.
procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'
Die Darstellung der RSS- und CPU-Auslastung eines einzelnen Prozesses (oder mehrerer) aus allen aufgezeichneten Prozessen würde folgendermaßen aussehen:
procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg
Die Diagramme sehen folgendermaßen aus (es handelt sich eigentlich um interaktive Pygal SVGs):
psrecord
Die folgenden Adresseneine Art Verlaufsdiagramm. Pythonpsrecord
Paket macht genau dies.
pip install psrecord # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip
Für einzelne Prozesse ist es das Folgende (gestoppt durch Ctrl+C):
psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png
Für einige Vorgänge ist das folgende Skript hilfreich, um die Diagramme zu synchronisieren:
#!/bin/bash
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'
Speicherprofiler
DerPaketbietet RSS-only-Sampling (plus einige Python-spezifische Optionen). Es kann auch Prozesse mit seinen untergeordneten Prozessen aufzeichnen (siehe mprof --help
).
pip install memory_profiler
mprof run /path/to/executable
mprof plot
Standardmäßig wird ein Tkinter-basierter ( python-tk
eventuell erforderlicher) Diagramm-Explorer geöffnet, der exportiert werden kann:
Graphitstapel und Statsd
Für einen einfachen einmaligen Test mag das übertrieben erscheinen, aber für ein mehrtägiges Debugging ist es auf jeden Fall angemessen. Ein praktisches All-in-Oneraintank/graphite-stack
(von Grafanas Autoren) Bild undpsutil
Undstatsd
Klient.procmon.py
bietet eine Implementierung.
$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack
Dann in einem anderen Terminal, nachdem der Zielprozess gestartet wurde:
$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'
Öffnen Sie dann Grafana unter http://localhost:8080, authentifizieren Sie sich als admin:admin
und richten Sie die Datenquelle https://localhost ein. Sie können ein Diagramm wie das folgende zeichnen:
Graphit-Stapel & Telegraf
Anstatt die Metriken per Python-Skript an Statsd zu senden,telegraf
(und procstat
Eingabe-Plugin) können verwendet werden, um die Metriken direkt an Graphite zu senden.
Die Minimalkonfiguration telegraf
sieht folgendermaßen aus:
[agent]
interval = "1s"
[[outputs.graphite]]
servers = ["localhost:2003"]
prefix = "testprfx"
[[inputs.procstat]]
pid_file = "/path/to/file/with.pid"
Führen Sie dann die Zeile aus telegraf --config minconf.conf
. Der Grafana-Teil ist bis auf die Metriknamen derselbe.
pidstat
pidstat
(Teil des sysstat
Pakets) kann eine Ausgabe erzeugen, die leicht analysiert werden kann. Dies ist nützlich, wenn Sie zusätzliche Metriken von den Prozessen benötigen. Die nützlichsten 3 Gruppen (CPU, Speicher und Festplatte) enthalten beispielsweise: %usr
, %system
, %guest
, , %CPU
, , , , minflt/s
, , , , . Ich habe es in beschriebenmajflt/s
VSZ
RSS
%MEM
kB_rd/s
kB_wr/s
kB_ccwr/s
eine entsprechende Antwort.
Antwort3
htop
ist ein großartiger Ersatz für top
. Es hat … Farben! Einfache Tastaturkürzel! Scrollen Sie mit den Pfeiltasten durch die Liste! Beenden Sie einen Prozess, ohne ihn zu verlassen und ohne die PID zu notieren! Markieren Sie mehrere Prozesse und beenden Sie sie alle!
Unter allen Funktionen, die in der Manpage angegeben sind, können Sie drücken, Fumfolgenein Prozess.
Sie sollten es wirklich versuchen htop
. Ich habe nie top
wieder damit angefangen, nachdem ich es das erste Mal verwendet habe htop
.
Einen einzelnen Prozess anzeigen:
htop -p PID
Antwort4
Ich bin ein bisschen spät dran, aber ich werde meinen Befehlszeilentrick mit nur der Standardeinstellung teilenps
WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do
sleep 1
done
Ich verwende dies als Einzeiler. Hier löst die erste Zeile den Befehl aus und speichert die PID in der Variablen. Dann druckt ps die verstrichene Zeit, die PID, den Prozentsatz der CPU-Nutzung, den Prozentsatz des Speichers und den RSS-Speicher. Sie können auch andere Felder hinzufügen.
Sobald der Vorgang beendet ist, gibt der ps
Befehl nicht mehr „Erfolg“ zurück und die while
Schleife wird beendet.
Sie können die erste Zeile ignorieren, wenn die PID, die Sie profilieren möchten, bereits ausgeführt wird. Platzieren Sie einfach die gewünschte ID in der Variablen.
Sie erhalten eine Ausgabe wie diese:
00:00 7805 0.0 0.0 2784
00:01 7805 99.0 0.8 63876
00:02 7805 99.5 1.3 104532
00:03 7805 100 1.6 129876
00:04 7805 100 2.1 170796
00:05 7805 100 2.9 234984
00:06 7805 100 3.7 297552
00:07 7805 100 4.0 319464
00:08 7805 100 4.2 337680
00:09 7805 100 4.5 358800
00:10 7805 100 4.7 371736
....