¿Recuperar el uso de la CPU y la memoria de un solo proceso en Linux?

165

Quiero obtener el uso de CPU y memoria de un solo proceso en Linux: conozco el PID. Con suerte, puedo obtenerlo cada segundo y escribirlo en un CSV usando el comando 'watch'. ¿Qué comando puedo usar para obtener esta información de la línea de comandos de Linux?

Supertux
fuente
11
Pertenece a SuperUser.
Richard
¿Podemos usar gdb para llamar a getpid y top -p <that pid>?
mja

Respuestas:

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

(Puede dejar "cmd" pero eso puede ser útil para la depuración).

Tenga en cuenta que esto proporciona un uso promedio de la CPU del proceso durante el tiempo que se ha estado ejecutando.

coste y flete
fuente
66
La suposición sería que si le preocupa el uso de memoria de un solo proceso lo suficiente como para monitorearlo de esta manera, está utilizando una cantidad significativa de memoria para que los pares de megabytes adicionales debido a las asignaciones compartidas no sean un problema.
caf
55
@Chaitanya: canalícelo| tail -n +2
caf
11
O podría usar --noheader
hexacianuro
45
Tenga en cuenta que% cpu "es el tiempo de CPU utilizado dividido por el tiempo que el proceso ha estado ejecutándose (relación cputime / tiempo real), expresado como un porcentaje" (consulte la página de manual de ps). Este no es el uso real de la CPU justo a tiempo. También puede ser muy diferente de lo que topmuestra, por ejemplo.
xebeche
12
como se dijo en Xebeche justo arriba, ps -e -o pcpu,argsmostrará el promedio de la CPU durante la vida útil del proceso, que obviamente no es lo que desea si es un proceso de larga duración
Alex F
65

Una variante de la respuesta de caf : top -p <pid>

Esto actualiza automáticamente el uso de la CPU, por lo que es bueno para el monitoreo.

Manki
fuente
2
Funciona muy bien con pgrep:top -p $(pgrep process_name)
Matthias Braun
37

Puede obtener los resultados por el nombre del proceso usando

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

la -Copción le permite usar el nombre del proceso sin saber que es pid.

amit
fuente
¿Cómo incluir también de pid? He intentado% pid $ PID pid, PID sin suerte
Arnold Roa
@ArnoldRoa pidsolo debería funcionar. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha
28

Utilice pidstat (de sysstat - Enlace de referencia ).

por ejemplo, para monitorear estos dos ID de proceso (12345 y 11223) cada 5 segundos use

$ pidstat -h -r -u -v -p 12345,11223 5
Neón
fuente
2
¡Gracias por señalar pidstatque es un gran comando, y útil también por las secuencias de comandos!
fduff
pidstatTambién da un buen promedio. Es una pena que no haya encontrado una forma más elegante depidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
Northern-Bradley
24

ps comando (no debe usar):

top comando (debe usar):

Use toppara obtener el uso de la CPU en tiempo real (intervalo corto actual):

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

hará eco como: 78.6

vikyd
fuente
Esta es la respuesta más precisa para obtener el uso actual de la CPU, no un promedio durante la vida útil del proceso.
Ted Feng
15

Lanzar un programa y monitorearlo

Este formulario es útil si desea comparar fácilmente un ejecutable:

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

Ahora, cuando presiona Ctrl + C, sale del programa y deja de monitorear. Salida de muestra:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

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

Probado en Ubuntu 16.04.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
5

Puede usar top -by grep el pid que desee (con la -bparte superior de la bandera se ejecuta en modo por lotes), o también usar la -pbandera y especificar el pid sin usar grep.

Alberto Zaccagni
fuente
5

Como se comentó en la respuesta anterior de caf , ps y, en algunos casos, pidstat le proporcionarán el promedio de vida útil de la pCPU. Para obtener resultados más precisos use top. Si necesita ejecutar top una vez que puede ejecutar:

top -b -n 1 -p <PID>

o para procesar solo datos y encabezado:

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

sin encabezados:

top -b -n 1 -p <PID> | tail -2 | head -1
aviranh
fuente
3
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

o por proceso

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

Para obtener el uso de memoria solo de su aplicación (a diferencia de las bibliotecas compartidas que usa, debe usar la interfaz smaps de Linux). Esta respuesta lo explica bien .

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

donde la primera columna es el PID, el uso de la CPU de la segunda columna, el uso de la memoria de la tercera columna.

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

PID - ID del proceso

etime - Proceso en ejecución / Duración en vivo

% cpu - uso de CPU

% mem - Uso de memoria

cmd - Comando

Reemplace el nombre del proceso con el proceso que desee rastrear, mysql nginx php-fpm, etc.

Siva KR
fuente
1

Todas las respuestas aquí muestran solo el porcentaje de memoria para el PID.

Aquí hay un ejemplo de cómo obtener el uso de memoria rss en KB para todos los procesos de apache, reemplace "grep apache" con "grep PID" si solo quiere ver un PID específico:

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

Esto imprime:

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}'"

Salida:

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
Plátano
fuente
1

Para aquellos que lucharon por un tiempo preguntándose por qué la respuesta seleccionada no funciona:

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

No hay espacio ibetween %cpu,y %mem.

ZhaoGang
fuente
1

Este es un buen truco para seguir uno o más programas en tiempo real y al mismo tiempo ver la salida de alguna otra herramienta: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"

Tom Wocken
fuente
1

El siguiente comando obtiene el promedio de uso de CPU y memoria cada 40 segundos para un proceso específico (pid)

pidstat 40 -ru -p <pid>

Salida para mi caso (primeras dos líneas para uso de CPU, segundas dos líneas para 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
Celik
fuente
0

(Si está en MacOS 10.10, pruebe la opción acumulativa -c de arriba:

top -c a -pid PID

(Esta opción no está disponible en otros Linux, probado con Scientific Linux el6 y RHEL6)

Kieleth
fuente
0

Lista de arriba el proceso de consumo de memoria y CPU superior

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

Según la respuesta de @ caf, esto funciona muy bien para mí.

Calcule el promedio para el PID dado:

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
Val
fuente
-2

Uso de CPU y memoria de un solo proceso en Linux o puede obtener los 10 principales procesos utilizados de la CPU utilizando el siguiente comando

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

jodido rojizo
fuente