¿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:
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:
[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.
[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”.
[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:
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:
[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