Wie kann man die CPU- / Speicherauslastung eines einzelnen Prozesses überwachen?


170

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


Welche Speicherstatistik möchten Sie? Es gibt viele von ihnen.
vwduder

Speicherauslastung über einen bestimmten Zeitraum, aktuelle Auslastung, maximale Auslastung, Durchschnitt.
Josh K

Antworten:


139

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

9
Und da Sie die PID möglicherweise nicht jedes Mal nachschlagen möchten, versuchen Sie etwas wie top -p `pgrep -f /usr/bin/kvm`.
Stefan Lasiewski

Ich verwende Cacti, um einige einzelne Prozesse zu überwachen, aber die Installation einer vollständigen Cacti-Installation klingt für die hier gestellte einfache Situation zu komplex.
Stefan Lasiewski

@Stefan: Ich gehe mal davon aus, dass ich das aus der Ferne ausführen müsste?
Josh K

@Josh: Ja, Sie müssten Cacti (für das MySQL, Apache und einige andere Pakete erforderlich sind) auf einem anderen Server ausführen. In den meisten Distributionen ist die Installation mit Yum oder apt-get ziemlich einfach.
Stefan Lasiewski

@Stefan Wenn Sie fernüberprüfen möchten, können Sie ssh @ remotehost 'top -p PID> ~ hostname_pid.txt ausführen. exit'and
klerk

61

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


7
+1 für htop. Dies ist eines der ersten Programme, die ich auf einem neuen System installiere. Es macht mein Leben viel einfacher. Die Baumansicht ist auch sehr praktisch.
Barthelemy

9
tophat auch farben. Drücken Sie z.
Tshepang

2
Du hast recht! 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).
Denilson Sá Maia

1
Und htop -p PIDwird genauso funktionieren wie das Beispiel von @Michael Mrozek.
Noisebleed

1
Der einzige Grund für die Verwendung von top ist, dass htop nicht verfügbar ist oder nicht installiert werden kann. Aus diesem Grund wurde htop erstellt, um viel mehr Funktionen bereitzustellen.
Lepe

59

psrecord

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'

Diagramme sehen aus wie: psrecord Beispiel

Speicher_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-basierter ( python-tkmöglicherweise erforderlicher) Diagrammexplorer angezeigt, der exportiert werden kann:

mprof

Graphit-Stapel & Statistik

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:

Grafana-Diagramm

Graphit-Stapel & Telegraf

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

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 systemd gibt mehrere Ausgabezeilen aus und behebt damit den psrecord. Was ist zu tun? Ich möchte nur mit jedem Prozess testen.
EralpB

1
@EralpB pgrep --helpzur Rettung. Zumindest gibt es --newestund --oldest.
Saaj

2
Dies sollte die akzeptierte Antwort sein, da es tatsächlich ein Verlaufsdiagramm der Speichernutzung gibt. Hinweis für die psrecord-Methode: Ctrl+CWenn der psrecord-Prozess gerade beendet wird, ohne dass ein Plot gespeichert wird, müssen Sie den zu testenden Prozess beenden.
user2561747

8

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.


Ähm, 10 Prozesse zur Überwachung der CPU-Auslastung von 1?
Xebeche

@xebeche "Es misst den Durchschnitt von 10 Schnappschüssen" "nTimes = 10; # anpassen " :)
Aquarius Power

Ich wollte damit sagen, dass ich die Tatsache nicht mag, dass Sie 10 Prozesse aufrufen, um 1 Nummer ( $nPercCpu) abzurufen : Shell, Top, Grep, Sed, Cut ... BC. Viele, wenn nicht alle, können Sie beispielsweise in 1 Sed- oder Awk-Skripten zusammenführen.
Xebeche

@ Xebeche cool, zögern Sie nicht zu bearbeiten Hinzufügen eines besseren Befehls zu der bestehenden (als Alternative), hast du meine Neugier :)
Wassermann Power

1
Ich habe meine eigene Antwort hinzugefügt . BTW, beachten Sie, dass bei der Berechnung eines durchschnittlichen keinen Sinn, weil top‚s Ausgang ist ein Mittelwert über $delay. Vgl. Berechnung der CPU-Auslastung
xebeche

5

Ich benutze normalerweise folgende zwei:

  1. 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.

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


6
Ich habe daemontools jahrelang benutzt. Es ist großartig als Supervisor / Watchdog für andere Prozesse. Wie können Sie die CPU- / Speicherauslastung für einen Prozess überwachen?
Stefan Lasiewski

3

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.


2

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

top -p $(pidof <process_name>)

8
Das ist so ziemlich das, was die akzeptierte Antwort von vor Jahren und ihr erster Kommentar aussagt.
Dhag

1

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


1

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)

0

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.


Möglicherweise möchten Sie weitere Details hinzufügen, um welche Version (en) topdieses Feature tatsächlich bereitgestellt wird. Meine Version auf Fedora 19 funktioniert nicht. Gleiches gilt auch für Ubuntu 13.04.
slm

Du hast Recht !, ich war so glücklich, etwas Nützliches gefunden zu haben, ich vergaß, dass ich zu Hause auf meinem Mac saß.
Kieleth,

0

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
  ....
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.