Recuperare l'utilizzo della CPU e l'utilizzo della memoria di un singolo processo su Linux?


165

Voglio ottenere l'utilizzo della CPU e della memoria di un singolo processo su Linux: conosco il PID. Spero di poterlo ottenere ogni secondo e scriverlo su un CSV usando il comando 'watch'. Quale comando posso usare per ottenere queste informazioni dalla riga di comando di Linux?


11
Appartiene a SuperUser.
Richard,

Possiamo usare gdb per chiamare getpid e top -p <quel pid>?
mja,

Risposte:


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

(Puoi lasciare "cmd" ma potrebbe essere utile nel debug).

Si noti che ciò fornisce un utilizzo medio della CPU del processo nel tempo in cui è stato eseguito.


6
Il presupposto sarebbe che se ti preoccupi abbastanza dell'utilizzo della memoria di un singolo processo per monitorarlo in questo modo, sta usando una quantità significativa di memoria in modo che la coppia aggiuntiva di megabyte dovuta ai mapping condivisi non sia un problema.
Caf

5
@Chaitanya: pipe it through| tail -n +2
caf

11
Oppure si potrebbe usare --noheader
hexacyanide

45
Tieni presente che% cpu "è il tempo di CPU utilizzato diviso per il tempo di esecuzione del processo (rapporto cputime / tempo reale), espresso in percentuale" (vedi la manpage di ps). Questo non è il vero utilizzo della CPU just in time. Può anche essere molto diverso da quello che topmostra, per esempio.
xebeche,

12
come detto da Xebeche appena sopra, ps -e -o pcpu,argsmostrerà la media della cpu per tutta la durata del processo, che ovviamente non è quello che vuoi se si tratta di un processo di lunga durata
Alex F

65

Una variante della risposta di caf : top -p <pid>

Questo aggiorna automaticamente l'utilizzo della CPU, quindi è buono per il monitoraggio.


2
Funziona bene con pgrep:top -p $(pgrep process_name)
Matthias Braun,

37

È possibile ottenere i risultati in base al nome del processo utilizzando

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

l' -Copzione ti consente di usare il nome del processo senza sapere che è pid.


come includere anche de pid? ho provato% pid $ PID pid, PID senza fortuna
Arnold Roa

pidSolo @ArnoldRoa dovrebbe funzionare. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha,

28

Usa pidstat (da sysstat - vedi link ).

ad es. per monitorare questi due ID di processo (12345 e 11223) ogni 5 secondi

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

2
grazie per aver sottolineato pidstatche è un ottimo comando e utile anche per gli script!
fduff,

pidstatdà anche una buona media. solo un peccato non ho trovato un modo più elegante dipidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
Northern-Bradley

24

ps comando (non usare):

top comando (dovrebbe usare):

Utilizzare topper ottenere l'utilizzo della CPU in tempo reale (intervallo breve corrente):

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

farà eco come: 78.6


Questa è la risposta più accurata per ottenere l'attuale utilizzo della CPU, non una media per tutta la durata del processo.
Ted Feng

15

Avvia un programma e monitoralo

Questo modulo è utile se si desidera confrontare facilmente un eseguibile:

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

Ora quando premi Ctrl + C esce dal programma e interrompe il monitoraggio. Uscita campione:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

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

Testato su Ubuntu 16.04.


5

È possibile utilizzare top -be estrarre il pid desiderato (con il -bflag in alto viene eseguito in modalità batch) oppure utilizzare il -pflag e specificare il pid senza utilizzare grep.


5

Come commentato nella risposta di caf sopra, ps e in alcuni casi pidstat ti daranno la media della vita della pCPU. Per ottenere risultati più accurati usa top. Se devi eseguire top una volta che puoi eseguire:

top -b -n 1 -p <PID>

o per elaborare solo dati e intestazione:

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

senza intestazioni:

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

o per processo

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


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

dove la prima colonna è il PID, l'utilizzo della CPU della seconda colonna, l'utilizzo della memoria della terza colonna.


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

PID - ID processo

etime - Processo in esecuzione / Durata live

% cpu: utilizzo della CPU

% mem: utilizzo della memoria

cmd - Comando

Sostituisci nome processo con qualsiasi processo desideri monitorare, mysql nginx php-fpm ecc ...


1

Tutte le risposte qui mostrano solo la percentuale di memoria per il PID.

Ecco un esempio di come ottenere l'utilizzo della memoria rss in KB per tutti i processi apache, sostituire "grep apache" con "grep PID" se si desidera solo guardare un PID specifico:

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

Questo stampa:

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

Con CPU%:

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

Produzione:

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

Per coloro che hanno lottato per un po 'chiedendosi perché la risposta selezionata non funziona:

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

Nessuno spazio tra %cpu,e %mem.


1

Questo è un bel trucco per seguire uno o più programmi in tempo reale mentre si guarda anche l'output di qualche altro strumento: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

Il comando seguente ottiene la media dell'utilizzo della CPU e della memoria ogni 40 secondi per un processo specifico (pid)

pidstat 40 -ru -p <pid>

Output per il mio caso (prime due righe per l'utilizzo della CPU, seconde due righe per la memoria):

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

(Se ti trovi in ​​MacOS 10.10, prova l'opzione -c cumulativa di top:

top -c a -pid PID

(Questa opzione non è disponibile in altri Linux, provata con Scientific Linux el6 e RHEL6)


0

Sopra l'elenco della CPU principale e il processo che consuma memoria

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

0

Basato sulla risposta di @ caf, questo funziona bene per me.

Calcola media per PID dato:

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"

Uso:

# send PID as argument
sh measure.sh 3282

-2

Utilizzo della CPU e della memoria di un singolo processo su Linux oppure è possibile ottenere i primi 10 processi CPU utilizzati utilizzando il comando seguente

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.