CPU-Auslastung und Speicherauslastung eines einzelnen Prozesses unter Linux abrufen?


164

Ich möchte die CPU- und Speicherauslastung eines einzelnen Prozesses unter Linux ermitteln - ich kenne die PID. Hoffentlich kann ich es jede Sekunde abrufen und mit dem Befehl 'watch' in eine CSV schreiben. Mit welchem ​​Befehl kann ich diese Informationen über die Linux-Befehlszeile abrufen?


11
Gehört zu SuperUser.
Richard

Können wir gdb verwenden, um getpid und top -p <diese pid> aufzurufen?
Mja

Antworten:


225
ps -p <pid> -o %cpu,%mem,cmd

(Sie können "cmd" weglassen, dies kann jedoch beim Debuggen hilfreich sein.)

Beachten Sie, dass dies die durchschnittliche CPU-Auslastung des Prozesses über die Zeit angibt, in der er ausgeführt wurde.


6
Die Annahme wäre, dass, wenn Sie sich genug um die Speichernutzung eines einzelnen Prozesses kümmern, um ihn so zu überwachen, eine erhebliche Menge an Speicher verwendet wird, sodass die zusätzlichen paar Megabyte aufgrund gemeinsam genutzter Zuordnungen kein Problem darstellen.
Café

4
@Chaitanya: Pfeife es durch| tail -n +2
Café

11
Oder Sie könnten --noheader
Hexacyanid verwenden

45
Beachten Sie, dass% cpu "die verwendete CPU-Zeit geteilt durch die Zeit, in der der Prozess ausgeführt wurde (Verhältnis cputime / realtime), ausgedrückt als Prozentsatz" (siehe Manpage von ps). Dies ist nicht die echte Just-in-Time-CPU-Auslastung. Es kann sich auch sehr von dem unterscheiden, was topzum Beispiel gezeigt wird.
Xebeche

12
Wie von Xebeche oben gesagt, ps -e -o pcpu,argswird der CPU-Durchschnitt über die Lebensdauer des Prozesses angezeigt , was offensichtlich nicht das ist, was Sie wollen, wenn es sich um einen lang laufenden Prozess handelt
Alex F

65

Eine Variante der Antwort von caf : top -p <pid>

Dadurch wird die CPU-Auslastung automatisch aktualisiert, sodass eine Überwachung möglich ist.


2
Funktioniert gut mit pgrep:top -p $(pgrep process_name)
Matthias Braun

37

Sie können die Ergebnisse anhand des Namens des Prozesses abrufen

ps -C chrome -o %cpu,%mem,cmd

Mit dieser -COption können Sie den Prozessnamen verwenden, ohne die PID zu kennen.


Wie kann man auch de pid einbeziehen? Ich habe% pid $ PID pid, PID ohne Glück versucht
Arnold Roa

@ArnoldRoa pidsollte nur funktionieren. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha

28

Verwenden Sie pidstat (von sysstat - siehe Link ).

zB um diese beiden Prozess-IDs (12345 und 11223) alle 5 Sekunden zu überwachen

$ pidstat -h -r -u -v -p 12345,11223 5

2
Vielen Dank für den Hinweis, pidstatdass dies ein großartiger Befehl ist und auch praktisch für Skripte!
fduff

pidstatgibt auch einen schönen Durchschnitt. Nur schade, dass ich keinen eleganteren Weg gefunden habepidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
Northern Bradley

24

ps Befehl (sollte nicht verwendet werden):

top Befehl (sollte verwenden):

Verwenden Sie topdiese Option , um die CPU-Auslastung in Echtzeit abzurufen (aktuelles kurzes Intervall):

top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'

wird wie folgt widerhallen: 78.6


Dies ist die genaueste Antwort, um die aktuelle CPU-Auslastung zu ermitteln, nicht ein Durchschnitt über die Lebensdauer des Prozesses.
Ted Feng

15

Starten Sie ein Programm und überwachen Sie es

Dieses Formular ist nützlich, wenn Sie eine ausführbare Datei einfach vergleichen möchten:

topp() (
  $* &>/dev/null &
  pid="$!"
  trap ':' INT
  echo 'CPU  MEM'
  while sleep 1; do ps --no-headers -o '%cpu,%mem' -p "$pid"; done
  kill "$pid"
)
topp ./myprog arg1 arg2

Wenn Sie nun Strg + C drücken, wird das Programm beendet und die Überwachung beendet. Beispielausgabe:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

Verbunden: /unix/554/how-to-monitor-cpu-memory-usage-of-a-single-process

Getestet unter Ubuntu 16.04.


5

Sie können top -bdie gewünschte PID verwenden und auslesen (wobei das -bFlag oben im Batch-Modus ausgeführt wird) oder auch das -pFlag verwenden und die PID angeben, ohne grep zu verwenden.


5

Wie in der obigen Antwort von caf kommentiert , geben ps und in einigen Fällen pidstat den Lebenszeitdurchschnitt der pCPU an. Um genauere Ergebnisse zu erhalten, verwenden Sie top. Wenn Sie top ausführen müssen, können Sie Folgendes ausführen:

top -b -n 1 -p <PID>

oder nur für Prozessdaten und Header:

top -b -n 1 -p <PID> | tail -3 | head -2

ohne Überschriften:

top -b -n 1 -p <PID> | tail -2 | head -1

3
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

oder pro Prozess

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql

1

Um die Speichernutzung nur Ihrer Anwendung zu ermitteln (im Gegensatz zu den von ihr verwendeten gemeinsam genutzten Bibliotheken müssen Sie die Linux-Smaps-Schnittstelle verwenden). Diese Antwort erklärt es gut .


1
ps aux|awk  '{print $2,$3,$4}'|grep PID

Dabei ist die erste Spalte die PID, die CPU-Auslastung in der zweiten Spalte und die Speichernutzung in der dritten Spalte.


1
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep

PID - Prozess-ID

etime - Prozesslauf / Live-Dauer

% cpu - CPU-Auslastung

% mem - Speichernutzung

cmd - Befehl

Ersetzen Sie den Prozessnamen durch den Prozess, den Sie verfolgen möchten, mysql nginx php-fpm usw.


1

Alle Antworten hier zeigen nur den Speicherprozentsatz für die PID.

Hier ist ein Beispiel, wie Sie die RSS-Speichernutzung in KB für alle Apache-Prozesse ermitteln können. Ersetzen Sie "grep apache" durch "grep PID", wenn Sie nur eine bestimmte PID anzeigen möchten:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"

Dies druckt:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'                                                                                                                                                                                                          
Thu Jan 25 15:44:13 2018

12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360

Mit CPU%:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"

Ausgabe:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'                                                                                                                                                                                                       
Thu Jan 25 15:46:00 2018

12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360

1

Für diejenigen, die sich eine Weile schwer getan haben und sich fragen, warum die ausgewählte Antwort nicht funktioniert:

ps -p <pid> -o %cpu,%mem

Kein Platz zwischen %cpu,und %mem.


1

Dies ist ein guter Trick, um ein oder mehrere Programme in Echtzeit zu verfolgen und gleichzeitig die Ausgabe eines anderen Tools zu sehen: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

Der folgende Befehl ermittelt alle 40 Sekunden den Durchschnitt der CPU- und Speicherauslastung für einen bestimmten Prozess (pid).

pidstat 40 -ru -p <pid>

Ausgabe für meinen Fall (erste zwei Zeilen für die CPU-Auslastung, zweite zwei Zeilen für den Speicher):

02:15:07 PM       PID    %usr %system  %guest    %CPU   CPU  Command
02:15:47 PM     24563    0.65    0.07    0.00    0.73     3  java

02:15:07 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:15:47 PM     24563      6.95      0.00 13047972 2123268   6.52  java

0

(Wenn Sie sich in MacOS 10.10 befinden, versuchen Sie die akkumulative Option -c von oben:

top -c a -pid PID

(Diese Option ist unter anderen Linux-Versionen nicht verfügbar, die mit Scientific Linux el6 und RHEL6 getestet wurden.)


0

Oben ist der Top-Prozess für CPU- und Speicherverbrauch aufgeführt

        ps axo %cpu,%mem,command | sort -nr | head

0

Basierend auf der Antwort von @ caf funktioniert das gut für mich.

Berechnen Sie den Durchschnitt für die angegebene PID:

Measure.sh

times=100
total=0
for i in $(seq 1 $times)
do
   OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
   echo -n "$i time: ${OUTPUT}"\\r
   total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc

average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"

Verwendung:

# send PID as argument
sh measure.sh 3282

-2

CPU- und Speicherauslastung eines einzelnen Prozesses unter Linux oder Sie können die 10 am häufigsten verwendeten CPU-Prozesse mit dem folgenden Befehl abrufen

ps -aux --sort -pcpu | Kopf -n 11

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.