Ich möchte die Speicher- / CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich, topaber nur auf einen Prozess ausgerichtet, vorzugsweise mit einem Verlaufsdiagramm.
Ich möchte die Speicher- / CPU-Auslastung eines Prozesses in Echtzeit überwachen. Ähnlich, topaber nur auf einen Prozess ausgerichtet, vorzugsweise mit einem Verlaufsdiagramm.
Antworten:
topUnterstü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
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 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 topwieder angefangen , nachdem ich es zum ersten Mal benutzt habe htop.
Zeigen Sie einen einzelnen Prozess an:
htop -p PID
tophat auch farben. Drücken Sie z.
tophat 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 PIDwird genauso funktionieren wie das Beispiel von @Michael Mrozek.
Im Folgenden wird eine Art Verlaufsdiagramm behandelt . Python- psrecordPaket 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-tkmö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-stackGerät (von Grafanas Autoren) für Bild psutilund statsdKunde. procmon.pybietet 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:adminund 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 procstatEingabe-Plugin) verwendet werden, um die Metriken direkt an Graphite zu senden.
Minimale telegrafKonfiguration 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 sysdigin Lua geschriebene Erweiterung) möglich sein.
pgrep --helpzur Rettung. Zumindest gibt es --newestund --oldest.
Ctrl+CWenn 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 1234wobei 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 topund kann awkman 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 $delayDatenmengen, da der gedruckte Zeitstempel $delayaufgrund der Funktionsweise topder 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.
topdieses 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 psBefehl nicht "Erfolg" zurück und die whileSchleife 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
....