Procpath

Procpath

Ich möchte die Speicher-/CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich wie, topaber nur auf einen Prozess ausgerichtet, vorzugsweise mit einer Art Verlaufsdiagramm.

Antwort1

Unterstützt unter Linux toptatsä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):

RSS CPU

psrecord

Die folgenden Adresseneine Art Verlaufsdiagramm. PythonpsrecordPaket 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'

Diagramme sehen so aus: psrecord-Beispiel

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-tkeventuell erforderlicher) Diagramm-Explorer geöffnet, der exportiert werden kann:

mprof

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 undpsutilUndstatsdKlient.procmon.pybietet 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:adminund richten Sie die Datenquelle https://localhost ein. Sie können ein Diagramm wie das folgende zeichnen:

Grafana-Diagramm

Graphit-Stapel & Telegraf

Anstatt die Metriken per Python-Skript an Statsd zu senden,telegraf(und procstatEingabe-Plugin) können verwendet werden, um die Metriken direkt an Graphite zu senden.

Die Minimalkonfiguration telegrafsieht 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 sysstatPakets) 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/sVSZRSS%MEMkB_rd/skB_wr/skB_ccwr/seine entsprechende Antwort.

Antwort3

htopist 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 topwieder 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 psBefehl nicht mehr „Erfolg“ zurück und die whileSchleife 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
  ....

verwandte Informationen