¿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?


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.


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.


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.


¿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

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


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.


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.


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

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


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.


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.


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

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.


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"


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

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)


0

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

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

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

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.