¿Cómo saber que procesos consumen más CPU y memoria en Linux?

Ya sabéis que utilizo la web como Wiki personal, así que va otro artículo para mis apuntes. En este caso veremos diferentes maneras de obtener un top de procesos, que ocupan más memoria y CPU, en nuestros sistemas GNU/Linux. Para ello me he servido de la información recopilada en diversas webs, muchas de ellas colegas, a las que menciono al final del artículo. ¿Tan difícil es mencionar las fuentes en los artículos?

Antes de nada, ¿Qué es un proceso?

Se trata de un programa que se carga en memoria y se ejecuta de forma secuencial. A su vez, dicho proceso, según el sistema operativo, puede contener elementos paralelos de ejecución, como pueden ser diferentes hilos o threads.

En GNU Linux cada proceso puede generar procesos “hijos”, un ejemplo de ello, lo tenemos con el servicio o daemon sshd. Si accedemos a un servidor, con diferentes usuarios o bien con el mismo usuario varias veces, veremos una muestra:

  1. root      1922     1  0 Jan22 ?        00:00:52 /usr/sbin/sshd
  2. root     39467  1922  0 09:06 ?        00:00:00 sshd: root@pts/0
  3. root     41866  1922  0 09:06 ?        00:00:00 sshd: root@pts/1

En la información anterior, vemos que el proceso del demonio es el número 1922, sus hijos serían los otros dos. Respecto a este podéis ampliar información en la web de altenwald.org El tratamiento de los procesos también puede ser muy curioso e incluso pueden crear hasta zombis

Queda claro que cada uno de estos procesos, consume memoria y ciclos de CPU, pero la cuestión es, ¿Cómo sabemos que procesos están ocupando la mayoría de memoria y CPU de nuestro servidor? Pues bien, hay diferentes maneras, la mayoría de ellas utilizan la herramienta ‘ps’ , que muestra en pantalla un listado de los procesos que están ejecutando en el sistema, con una serie de información anexa.

Dicho comando, está acompañado por una serie de parámetros. El más común de ellos es “aux”, ¿Qué obtenemos?

  • a: Lista los procesos de todos los usuarios
  • u: Amplía la información, nos muestra que usuario lo utiliza, cuanto procesador utiliza, memoria, etcétera.
  • x: Muestra los procesos de todos los terminales y usuarios.

Si ejecutamos el comando con el parámetro, nos aparecerá listada una barbaridad de información. Si queremos acotar la información mostrada, podemos utilizar otros programas que nos ayuden con ese fin, por ejemplo, AWK o sort.

Con el resultado:

  1. [davidochobits@servwebnginx ~]$ ps aux --width 30 --sort -rss | head
  2. USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
  3. root       950  0.1  3.7 188224 38480 ?        Ss   09:35   0:00 fusioninventory-agent: wa
  4. root       672  0.1  2.6 328096 27064 ?        Ssl  09:35   0:00 /usr/bin/python -Es /usr/
  5. root       954  0.0  1.6 553660 16512 ?        Ssl  09:35   0:00 /usr/bin/python -Es /usr/
  6. root       775  0.0  1.5 113376 15928 ?        S    09:35   0:00 /sbin/dhclient -d -q -sf
  7. polkitd    648  0.0  1.2 528292 12660 ?        Ssl  09:35   0:00 /usr/lib/polkit-1/polkitd
  8. root       673  0.0  1.0 438352 10540 ?        Ssl  09:35   0:00 /usr/sbin/NetworkManager
  9. icinga    2178  0.0  0.8 671316  8708 ?        Ssl  09:35   0:00 /usr/lib64/icinga2/sbin/i
  10. root      2351  0.0  0.5 150888  6016 ?        Ss   09:40   0:00 sshd: davidochobits [priv
  11. root       951  0.0  0.5 283492  5200 ?        Ssl  09:35   0:00 /usr/sbin/rsyslogd -n

¿Qué hemos hecho? Resumiendo, con el parámetro “width” , indicamos el ancho de pantalla; con “sort” ordenamos el resultado, combinado con el parámetro “rss”, por uso de memoria. Por último, mediante una tubería o pipe, utilizamos el comando “head”, de esta manera se nos muestran las primeras líneas.

Una manera más simple, teniendo en cuenta que la salida del programa viene separada por columnas, podemos indicar que simplemente nos ordene la columna de memoria.

  1. [root@servwebnginx ~]# ps aux --sort pmem
  2. chrony     658  0.0  0.1 115860  1852 ?        S    15:41   0:00 /usr/sbin/chronyd
  3. root       470  0.1  0.1  43564  1860 ?        Ss   15:41   0:00 /usr/lib/systemd/systemd-udevd
  4. root      2333  0.0  0.1 151208  1892 pts/0    R+   15:42   0:00 ps aux --sort pmem
  5. root      2296  0.0  0.1 115392  2024 tty1     Ss+  15:42   0:00 -bash
  6. root      2316  0.0  0.1 115396  2028 pts/0    Ss   15:42   0:00 -bash
  7. root      2204  0.0  0.2  89544  2092 ?        Ss   15:41   0:00 /usr/libexec/postfix/master -w
  8. root       976  0.0  0.2 122924  2124 ?        Ss   15:41   0:00 nginx: master process /usr/sbin/nginx
  9. root       462  0.1  0.2  34996  2336 ?        Ss   15:41   0:00 /usr/lib/systemd/systemd-journald
  10. root       654  0.1  0.2  94920  2680 ?        Ss   15:41   0:00 login -- root
  11. nginx      977  0.0  0.3 123304  3156 ?        S    15:41   0:00 nginx: worker process
  12. root         1  1.2  0.3 125168  3668 ?        Ss   15:41   0:00 /usr/lib/systemd/systemd --switched-root --system -
  13. root       961  0.0  0.3 283492  3828 ?        Ssl  15:41   0:00 /usr/sbin/rsyslogd -n
  14. postfix   2210  0.0  0.3  89648  4008 ?        S    15:41   0:00 pickup -l -t unix -u
  15. postfix   2211  0.0  0.3  89716  4036 ?        S    15:41   0:00 qmgr -l -t unix -u
  16. root       953  0.0  0.3 105972  4048 ?        Ss   15:41   0:00 /usr/sbin/sshd -D
  17. root      2314  0.4  0.6 150888  6100 ?        Ss   15:42   0:00 sshd: root@pts/0
  18. root       676  0.2  0.8 438272  8492 ?        Ssl  15:41   0:00 /usr/sbin/NetworkManager --no-daemon
  19. icinga    2235  0.0  0.8 671316  8708 ?        Ssl  15:41   0:00 /usr/lib64/icinga2/sbin/icinga2 --no-stack-rlimit d
  20. polkitd    638  0.0  1.1 528292 11644 ?        Ssl  15:41   0:00 /usr/lib/polkit-1/polkitd --no-debug
  21. root       778  0.0  1.5 113376 15932 ?        S    15:41   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helpe
  22. root       957  0.2  1.6 553660 16524 ?        Ssl  15:41   0:00 /usr/bin/python -Es /usr/sbin/tuned -l -P
  23. root       670  0.7  2.6 328096 27056 ?        Ssl  15:41   0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --
  24. root       960  0.7  3.7 188224 38480 ?        Ss   15:41   0:00 fusioninventory-agent: waiting

Es una solución un poco de estar por casa, ya que la salida te muestra todos los procesos del sistema y depende, según en qué servidor estés, pueden ser una lista excesivamente larga.

Si queremos un resultado con cara y ojos, vamos a utilizar el lenguaje de programación enfocado a textos “AWK” junto con el comando “head”. Mediante tuberías vamos a enlazar la salida estándar de “ps”.

  1. [root@servwebnginx ~]# ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 10
  2. PID %MEM COMMAND
  3. 960 3.7 fusioninventory-agent:
  4. 670 2.6 /usr/bin/python
  5. 957 1.6 /usr/bin/python
  6. 778 1.5 /sbin/dhclient
  7. 638 1.3 /usr/lib/polkit-1/polkitd
  8. 676 0.8 /usr/sbin/NetworkManager
  9. 2235 0.8 /usr/lib64/icinga2/sbin/icinga2
  10. 2314 0.6 sshd:
  11. 953 0.3 /usr/sbin/sshd

AWK nos ayuda a filtrar la salida, con los parámetros indicamos que nos filtre por las columnas 2, 4 y 11. Con “sort” indicamos la columna de referencia y con “head” sólo nos muestra los 10 primeros registros.

Filtrar exclusivamente los procesos que comsumen más CPU

Si nos interesa filtrar exclusivamente un top de procesos que utilizan más CPU, podemos ejecutar el comando y parámetros:

  1. ps -Ao user,uid,comm,pid,pcpu,tty --sort=-pcpu | head -n 6

En el caso de una de mis máquinas virtuales con Centos 7:

  1. [root@servcentos1 ~]# ps -Ao user,uid,comm,pid,pcpu,tty --sort=-pcpu | head -n 6
  2. USER       UID COMMAND           PID %CPU TT
  3. elastic+   997 java             1111  108 ?
  4. kibana     996 node              645 37.6 ?
  5. logstash   995 java              657 12.5 ?
  6. root         0 firewalld         717  6.5 ?
  7. root         0 systemd             1  6.4 ?

Otras maneras

Otras formas de filtrar los procesos por el consumo de memoria y CPU, es utilizar programas como top o htop.

Conclusión y referencias

Lo dejamos aquí, espero que os sea útil en alguna ocasión. Tal y cómo hemos visto, siempre hay más de una manera para hacer una cosa o como dice el refrán, cada «maestrillo tiene su librillo»

Os dejo también las referencias consultadas, en estas podéis ampliar información al respecto. Canela en rama colega!!

Blog desde Linux – Mostrar los 10 procesos que más memoria consumen

Sysadmit.com – Linux : Uso de memoria por proceso

Linuxito.com – Ps aux explicado

Longovil.com – ¿Qué proceso está consumiendo la memoria?

rm-rf.es – Linus: Listar procesos por % cpu o uso de memoria