¿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
2
3
root      1922     1  0 Jan22 ?        00:00:52 /usr/sbin/sshd
root     39467  1922  0 09:06 ?        00:00:00 sshd: root@pts/0
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
2
3
4
5
6
7
8
9
10
11
[davidochobits@servwebnginx ~]$ ps aux --width 30 --sort -rss | head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       950  0.1  3.7 188224 38480 ?        Ss   09:35   0:00 fusioninventory-agent: wa
root       672  0.1  2.6 328096 27064 ?        Ssl  09:35   0:00 /usr/bin/python -Es /usr/
root       954  0.0  1.6 553660 16512 ?        Ssl  09:35   0:00 /usr/bin/python -Es /usr/
root       775  0.0  1.5 113376 15928 ?        S    09:35   0:00 /sbin/dhclient -d -q -sf
polkitd    648  0.0  1.2 528292 12660 ?        Ssl  09:35   0:00 /usr/lib/polkit-1/polkitd
root       673  0.0  1.0 438352 10540 ?        Ssl  09:35   0:00 /usr/sbin/NetworkManager
icinga    2178  0.0  0.8 671316  8708 ?        Ssl  09:35   0:00 /usr/lib64/icinga2/sbin/i
root      2351  0.0  0.5 150888  6016 ?        Ss   09:40   0:00 sshd: davidochobits [priv
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@servwebnginx ~]# ps aux --sort pmem
chrony     658  0.0  0.1 115860  1852 ?        S    15:41   0:00 /usr/sbin/chronyd
root       470  0.1  0.1  43564  1860 ?        Ss   15:41   0:00 /usr/lib/systemd/systemd-udevd
root      2333  0.0  0.1 151208  1892 pts/0    R+   15:42   0:00 ps aux --sort pmem
root      2296  0.0  0.1 115392  2024 tty1     Ss+  15:42   0:00 -bash
root      2316  0.0  0.1 115396  2028 pts/0    Ss   15:42   0:00 -bash
root      2204  0.0  0.2  89544  2092 ?        Ss   15:41   0:00 /usr/libexec/postfix/master -w
root       976  0.0  0.2 122924  2124 ?        Ss   15:41   0:00 nginx: master process /usr/sbin/nginx
root       462  0.1  0.2  34996  2336 ?        Ss   15:41   0:00 /usr/lib/systemd/systemd-journald
root       654  0.1  0.2  94920  2680 ?        Ss   15:41   0:00 login -- root
nginx      977  0.0  0.3 123304  3156 ?        S    15:41   0:00 nginx: worker process
root         1  1.2  0.3 125168  3668 ?        Ss   15:41   0:00 /usr/lib/systemd/systemd --switched-root --system -
root       961  0.0  0.3 283492  3828 ?        Ssl  15:41   0:00 /usr/sbin/rsyslogd -n
postfix   2210  0.0  0.3  89648  4008 ?        S    15:41   0:00 pickup -l -t unix -u
postfix   2211  0.0  0.3  89716  4036 ?        S    15:41   0:00 qmgr -l -t unix -u
root       953  0.0  0.3 105972  4048 ?        Ss   15:41   0:00 /usr/sbin/sshd -D
root      2314  0.4  0.6 150888  6100 ?        Ss   15:42   0:00 sshd: root@pts/0
root       676  0.2  0.8 438272  8492 ?        Ssl  15:41   0:00 /usr/sbin/NetworkManager --no-daemon
icinga    2235  0.0  0.8 671316  8708 ?        Ssl  15:41   0:00 /usr/lib64/icinga2/sbin/icinga2 --no-stack-rlimit d
polkitd    638  0.0  1.1 528292 11644 ?        Ssl  15:41   0:00 /usr/lib/polkit-1/polkitd --no-debug
root       778  0.0  1.5 113376 15932 ?        S    15:41   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helpe
root       957  0.2  1.6 553660 16524 ?        Ssl  15:41   0:00 /usr/bin/python -Es /usr/sbin/tuned -l -P
root       670  0.7  2.6 328096 27056 ?        Ssl  15:41   0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --
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
2
3
4
5
6
7
8
9
10
11
[root@servwebnginx ~]# ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 10
PID %MEM COMMAND
960 3.7 fusioninventory-agent:
670 2.6 /usr/bin/python
957 1.6 /usr/bin/python
778 1.5 /sbin/dhclient
638 1.3 /usr/lib/polkit-1/polkitd
676 0.8 /usr/sbin/NetworkManager
2235 0.8 /usr/lib64/icinga2/sbin/icinga2
2314 0.6 sshd:
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
2
3
4
5
6
7
[root@servcentos1 ~]# ps -Ao user,uid,comm,pid,pcpu,tty --sort=-pcpu | head -n 6
USER       UID COMMAND           PID %CPU TT
elastic+   997 java             1111  108 ?
kibana     996 node              645 37.6 ?
logstash   995 java              657 12.5 ?
root         0 firewalld         717  6.5 ?
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

2 Respuestas

  1. ¡ Genial post ! Esto me recuerda un pequeño script que hice para agrupar todos los procesos que se llaman igual. Vamos, de esas veces que tienes 4 procesos de chrome o, como me suele pasar a mi que tengo 20 o 30 terminales abiertos o sesiones de ssh con diferentes máquinas… en fin, una locura. Pero también es útil para cuando tienes varios procesos de apache, php u otros demonios que se forkean.
    https://poesiabinaria.net/2016/05/como-conocer-cpu-y-memoria-ocupada-por-un-grupo-de-procesos-con-el-mismo-nombre/

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: