Ich möchte die Speicher- / CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich, top
aber nur auf einen Prozess ausgerichtet, vorzugsweise mit einem Verlaufsdiagramm.
Ich möchte die Speicher- / CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich, top
aber nur auf einen Prozess ausgerichtet, vorzugsweise mit einem Verlaufsdiagramm.
Antworten:
top
Unterstützt unter Linux 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
top -p `pgrep -f /usr/bin/kvm`
.
hostname
_pid.txt ausführen. exit'and
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 die PID zu verlassen und ohne sie zu beachten! Markiere mehrere Prozesse und töte sie alle!
Unter allen Funktionen wird in der Manpage angegeben, dass Sie drücken können F, um einem Vorgang zu folgen .
Wirklich, du solltest es versuchen htop
. Ich habe nie top
wieder angefangen , nachdem ich es zum ersten Mal benutzt habe htop
.
Zeigen Sie einen einzelnen Prozess an:
htop -p PID
top
hat auch farben. Drücken Sie z
.
top
hat farben! Schade, dass seine Farben ziemlich nutzlos sind, besonders im Vergleich zu htop
(was die Prozesse anderer Benutzer verblasst und den Programm-Basisnamen hervorhebt).
htop -p PID
wird genauso funktionieren wie das Beispiel von @Michael Mrozek.
Im Folgenden wird eine Art Verlaufsdiagramm behandelt . 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 (vorübergehende 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'
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-basierter ( python-tk
möglicherweise erforderlicher) Diagrammexplorer angezeigt, der exportiert werden kann:
Es mag für einen einfachen einmaligen Test als übertrieben erscheinen, aber für so etwas wie ein mehrtägiges Debugging ist es mit Sicherheit vernünftig. Ein praktisches All-in-One- raintank/graphite-stack
Gerät (von Grafanas Autoren) für Bild psutil
und statsd
Kunde. procmon.py
bietet eine Implementierung.
$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack
Dann in einem anderen Terminal nach dem Start des Zielprozesses:
$ 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 , Authentifizierung als admin:admin
und richten Sie die Datenquelle https: // localhost ein . Sie können ein Diagramm wie das folgende zeichnen:
Anstelle von Python-Skripten kann das Senden der Metriken an Statsd telegraf
(und das procstat
Eingabe-Plugin) verwendet werden, um die Metriken direkt an Graphite zu senden.
Minimale telegraf
Konfiguration sieht so aus:
[agent]
interval = "1s"
[[outputs.graphite]]
servers = ["localhost:2003"]
prefix = "testprfx"
[[inputs.procstat]]
pid_file = "/path/to/file/with.pid"
Dann Zeile ausführen telegraf --config minconf.conf
. Der Grafana-Teil ist mit Ausnahme der Metriknamen identisch.
sysdig
(in Debian- und Ubuntu-Repos verfügbar) mit der sysdig-inspect- Benutzeroberfläche sehen sehr vielversprechend aus und bieten extrem feine Details zusammen mit der CPU-Auslastung und RSS, aber leider kann die Benutzeroberfläche sie nicht rendern und Ereignisse nicht nach Prozessen sysdig
filtern procinfo
Zeitpunkt des Schreibens. Dies sollte jedoch mit einem benutzerdefinierten Meißel (eine sysdig
in Lua geschriebene Erweiterung) möglich sein.
pgrep --help
zur Rettung. Zumindest gibt es --newest
und --oldest
.
Ctrl+C
Wenn der psrecord-Prozess gerade beendet wird, ohne dass ein Plot gespeichert wird, müssen Sie den zu testenden Prozess beenden.
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 Snapshots der CPU-Auslastung in einer gesamten Sekunde gemessen (Verzögerung von jeweils 0,1s * nTimes = 10). das liefert ein gutes und schnelles genaues Ergebnis dessen, was gerade passiert.
Passen Sie die Variablen an Ihre Bedürfnisse an.
$nPercCpu
) abzurufen : Shell, Top, Grep, Sed, Cut ... BC. Viele, wenn nicht alle, können Sie beispielsweise in 1 Sed- oder Awk-Skripten zusammenführen.
top
‚s Ausgang ist ein Mittelwert über $delay
. Vgl. Berechnung der CPU-Auslastung
Ich benutze normalerweise folgende zwei:
HP-Messschieber : Sehr gutes Tool zur Überwachung von Prozessen. Sie können auch Anrufdiagramme und andere Informationen auf niedriger Ebene überprüfen. Bitte beachten Sie jedoch, dass es nur für den persönlichen Gebrauch kostenlos ist.
daemontools : Eine Sammlung von Tools zum Verwalten von UNIX-Diensten
Mit top
und kann awk
man leicht ein durch Kommas getrenntes Protokoll von% CPU ( $9
) +% MEM ( $10
) erstellen, das später in jedes Statistik- und Grafiktool eingespeist 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 folgt 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 bei großen $delay
Datenmengen, da der gedruckte Zeitstempel $delay
aufgrund der Funktionsweise top
der Ausgabe tatsächlich zurückliegt . Ohne zu sehr ins Detail zu gehen, besteht eine einfache Möglichkeit darin, die Zeit zu protokollieren, die bereitgestellt wird durch top
:
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 verzögert $delay
.
Wenn Sie den Prozessnamen kennen, können Sie diesen verwenden
top -p $(pidof <process_name>)
Wenn Sie eine eingeschränkte Linux-Distribution haben, für die die Option "top" nicht pro Prozess (-p) oder verwandte Optionen enthält, können Sie die Ausgabe des Befehls "top" nach Ihrem Prozessnamen analysieren, um die CPU-Nutzungsinformationen pro Prozess abzurufen.
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8 stellt die CPU-Auslastung pro Prozess in der Ausgabe des Befehls top in meiner eingebetteten Linux-Distribution dar
Nicht genug Reputation, um Kommentare abzugeben, aber für psrecord können Sie es auch direkt in Python programmatisch aufrufen:
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
Wenn Sie die Durchschnittswerte für einen bestimmten Zeitraum eines Prozesses benötigen, versuchen Sie es mit der akkumulativen Option -c von top:
top -c a -pid PID
"-c a" wurde in top für Mac 10.8.5 gefunden.
Für Scientific Linux ist die Option -S, die interaktiv festgelegt werden kann.
top
dieses Feature tatsächlich bereitgestellt wird. Meine Version auf Fedora 19 funktioniert nicht. Gleiches gilt auch für Ubuntu 13.04.
Ich bin ein bisschen spät dran, aber ich werde meinen Befehlszeilentrick nur mit der Standardeinstellung teilen ps
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 gibt ps die verstrichene Zeit, die PID die prozentuale CPU-Auslastung, den prozentualen Speicher und den RSS-Speicher aus. Sie können auch andere Felder hinzufügen.
Sobald der Prozess endet, gibt der ps
Befehl nicht "Erfolg" zurück und die while
Schleife wird beendet.
Sie können die erste Zeile ignorieren, wenn die zu profilierende PID bereits ausgeführt wird. Geben Sie einfach die gewünschte ID in die Variable ein.
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
....