it-swarm.com.de

Wie kann die CPU- / Speicherauslastung eines einzelnen Prozesses überwacht werden?

Ich möchte die Speicher-/CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich wie top, jedoch nur für einen Prozess, vorzugsweise mit einem Verlaufsdiagramm.

194
Josh K

Unter Linux unterstützt top die Fokussierung auf einen einzelnen Prozess, obwohl es natürlich kein Verlaufsdiagramm gibt:

top -p PID

Dies ist auch unter Mac OS X mit einer anderen Syntax verfügbar:

top -pid PID
157
Michael Mrozek

psrecord

Die folgenden Adressen Verlaufsdiagramme . Python psrecord Paket macht genau das.

pip install psrecord                             # local user install
Sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

Für einen einzelnen Prozess ist es der folgende (gestoppt von Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

Für mehrere Prozesse 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 aus wie folgt: psrecord example

memory_profiler

Das Paket bietet nur RSS-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-basiertes (python-tk wird möglicherweise benötigt) Diagramm-Explorer, der exportiert werden kann:

(mprof

graphitstapel & Statistik

Es mag für einen einfachen einmaligen Test als Overkill erscheinen, aber für so etwas wie ein mehrtägiges Debugging ist es mit Sicherheit vernünftig. Ein handliches All-in-One raintank/graphite-stack (von Grafanas Autoren) Bild und psutil und statsd Client. 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: 808 , Authentifizierung als admin:admin Wenn Sie die Datenquelle https: // localhost einrichten, können Sie ein Diagramm wie folgt zeichnen:

(grafana chart

graphitstapel & Telegraf

Anstelle von Python Skript, das die Metriken an Statsd sendet, kann telegraf (und procstat Eingabe-Plugin) zum Senden der Metriken verwendet werden direkt zu Graphit.

Die minimale telegraf Konfiguration 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 telegraf --config minconf.conf. Der Grafana-Teil ist bis auf die Namen der Metriken identisch.

pidstat

pidstat (Teil des Pakets sysstat) kann eine Ausgabe erzeugen, die leicht analysiert werden kann. Dies ist nützlich, wenn Sie zusätzliche Metriken für die Prozesse benötigen, z. Die nützlichsten 3 Gruppen (CPU, Speicher und Festplatte) enthalten: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. Ich habe es in eine verwandte Antwort beschrieben.

87
saaj

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 beachten! Markiere mehrere Prozesse und töte sie alle!

Unter allen Funktionen steht auf der Manpage, dass Sie drücken können F um einem Prozess zu folgen .

Wirklich, Sie sollten htop versuchen. Ich habe top nie wieder gestartet, nachdem ich htop zum ersten Mal verwendet habe.

Zeigen Sie einen einzelnen Prozess an:

htop -p PID

67

So verwenden Sie diese Informationen in einem Skript:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

benutze wie: calcPercCpu.sh 1234 wobei 1234 die PID ist

Für die angegebene $ nPid wird der Durchschnitt von 10 Schnappschüssen der CPU-Auslastung in insgesamt 1 Sekunde gemessen (Verzögerung von jeweils 0,1 s * nTimes = 10); Das liefert ein gutes und schnelles genaues Ergebnis dessen, was gerade passiert.

Passen Sie die Variablen an Ihre Bedürfnisse an.

8
Aquarius Power

Normalerweise benutze ich folgende zwei:

  1. HP Caliper : Es ist ein sehr gutes Tool zur Überwachung von Prozessen. Sie können auch Anrufdiagramme und andere Informationen auf niedriger Ebene überprüfen. Bitte beachten Sie, dass es nur für den persönlichen Gebrauch kostenlos ist.

  2. daemontools : Eine Sammlung von Tools zum Verwalten von UNIX-Diensten

5
Hemant

Mit top und awk könnte man leicht z.B. Ein durch Kommas getrenntes Protokoll der Verwendung von% CPU ($9) +% MEM ($10), das später in jedes Statistik- und Grafiktool eingegeben werden kann.

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

Die Ausgabe wird wie sein

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

Dies führt jedoch nicht zu guten Ergebnissen für große $delay, Da der gedruckte Zeitstempel aufgrund der Funktionsweise der Ausgabe von top tatsächlich $delay Zurückliegt. Ohne zu sehr ins Detail zu gehen, besteht eine einfache Möglichkeit darin, die von top bereitgestellte Zeit zu protokollieren:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

Dann ist der Zeitstempel genau, aber die Ausgabe wird immer noch um $delay Verzögert.

5
xebeche

Wenn Sie den Prozessnamen kennen, können Sie ihn verwenden

top -p $(pidof <process_name>)
2
user4757345

Ich bin hier etwas spät dran, aber ich werde meinen Befehlszeilentrick nur mit dem Standard ps teilen

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 benutze 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 die prozentuale CPU-Auslastung, den prozentualen Speicher und den RSS-Speicher. Sie können auch andere Felder hinzufügen.

Sobald der Prozess beendet ist, gibt der Befehl ps keinen "Erfolg" zurück und die Schleife while 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 folgt:

  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
  ....
2
theist

Nicht genug Ruf, um einen Kommentar abzugeben, aber für psrecord können Sie ihn auch direkt, programmgesteuert, direkt in Python aufrufen:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

Wenn Sie eine reduzierte Linux-Distribution haben, in der top keine Option pro Prozess (-p) oder verwandte Optionen hat, können Sie die Ausgabe des Befehls top nach Ihrem Prozessnamen analysieren, um die Informationen zur CPU-Auslastung pro Prozess abzurufen.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8 repräsentiert die CPU-Auslastung pro Prozess in der Ausgabe des Befehls top in meiner eingebetteten Linux-Distribution

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

alle 2 Sekunden Druckvorgang 7994 CPU-Auslastung

0
赵宝磊

Wenn Sie die Durchschnittswerte für einen bestimmten Zeitraum eines bestimmten Prozesses benötigen, versuchen Sie die akkumulative Option -c von oben:

top -c a -pid PID

"-c a" oben für Mac 10.8.5.

Für Scientific Linux ist die Option -S, die interaktiv festgelegt werden kann.

0
Kieleth