¿Cómo saber qué procesos consumen más CPU en Linux?

Es importante que nuestra máquina Linux mantenga una carga de CPU adecuada. Por eso debemos averiguar qué procesos consumen más porcentaje de trabajo de la CPU.

 

En este artículo:

 

 

 

 

 

El comando top

 

El comando top muestra datos relacionados con el rendimiento del sistema. Por defecto se actualiza cada 5 segundos.

comando top | carga cpu

 

  • Además de comprobar la cantidad de procesos en ejecución, podemos ver la carga de la CPU:  %CPU

  • También es interesante el porcentaje de CPU idle, que es el porcentaje de la CPU que está inactivo, sin carga de trabajo (cuanto menor sea este porcentaje, más saturado está el sistema).

  • Con top podemos encontrar los procesos zombies si los hay..

 

En la primera línea del resultado de top, podemos ver un resumen de los procesos. Una métrica importante es la de load average.
 

TOP
 

Load average es el Promedio de carga del sistema, calculado en intervalos de 1, 5 y 15 minutos.

 

Interpretaciones de Load Average:

 

  • Si los promedios son 0.0, entonces el sistema está inactivo.
  • Si el promedio de 1 minuto es más alto que los promedios de 5 o 15 minutos, entonces la carga está aumentando.
  • Si el promedio de 1 minuto es menor que los promedios de 5 o 15 minutos, entonces la carga está disminuyendo.
  • Si son más altos que su conteo de CPU, entonces podríamos tener un problema de rendimiento.

 
–> Lo más adecuado es encontrar valores por denbjo de 1 en cada procesador.
 

 

Usando filtros en top para filtrar por porcentaje de CPU

 

top permite ordenar el resultado mostrado, eligiendo el campo deseado para el filtro. En este caso elegiremos el campo de CPU : %CPU
 

Para usar el filtrado por campos, debemos usar el parámetro -o, y el nombre del campo:

top -o %CPU

 

filtrar top por uso de cpu
 

 

Otros campos (fields) que muestra el comando top

 

Si quisiéramos ordenar/filtrar por otros campos, podemos usar la letra f para mostrar todos los campos disponibles:

* PID = Process Id TGID = Thread Group Id  

* USER = Effective User Name ENVIRON = Environment vars  

* PR = Priority vMj = Major Faults delta  

* NI = Nice Value vMn = Minor Faults delta  

* VIRT = Virtual Image (KiB) USED = Res+Swap Size (KiB)  

* RES = Resident Size (KiB) nsIPC = IPC namespace Inode  

* SHR = Shared Memory (KiB) nsMNT = MNT namespace Inode  

* S = Process Status nsNET = NET namespace Inode  

* %CPU = CPU Usage nsPID = PID namespace Inode  

* %MEM = Memory Usage (RES) nsUSER = USER namespace Inode  

* TIME+ = CPU Time, hundredths nsUTS = UTS namespace Inode  

* COMMAND = Command Name/Line  

 

Después, nos colocamos encima del campo deseado, pulsamos la tecla s (sort), y la tecla q (quit) para salir del menú,

comando top - filtrar por uso de memoria
 

y veremos el nuevo resultado del filtrado que hará top:

top filtrar por uso memoria

 

 

Comando ps

 
Lo primero que tenemos que tener en cuenta con el comando ps es que acepta la sintaxis BSD y la sintaxis de UNIX.
 

Diferenciación básica:

  • Sintaxis BSD : las opciones no usan guión.
  • Sintaxis UNIX : las opciones usan guión.

 

 

El comando ps por defecto muestra una instantánea de los procesos en ejecución en el sistema.

linux ps por defecto
 

 

Mostrar todos los procesos con ps:

 

  • ps ax
  • ps -e

 

salida del comando:

ps ax

ps -ax | mostrar todos procesos

 

 

salida del comando:

ps -e

ps -e
 

 

Mostrar info detallada de los procesos:

 

  • usando la opción u :
  • ps aux
  • usando la opción -f :
  • ps -ef

 

salida del comando:

ps aux

 
ps -aux
 

 

salida del comando:

ps-ef

ps -ef | info detallada de procesos
 

 

Ordenando la salida del comando ps, según el consumo de CPU o Memoria

 
Se pueden especificar múltiples campos cuando se usa la opción “–sort” , separados por una coma.

Además, los campos pueden ir precedidos por el símbolo “” o “+“, indicando que se use el orden descendente o ascendente respectivamente.

 

ps aux --sort=-pcpu

 

A continuación vemos cómo se ordenan los procesos en orden descendiente (de mayor a menor consumo de CPU):

ps aux --sort=-pcpu

 

 
pcpu es compatible con %cpu, según los especificadores standard de formato (STANDARD FORMAT SPECIFIERS):

pcpu - STANDARD FORMAT SPECIFIERS

 

 
Aquí vemos el resultado de la salida ordenada, usando %cpu en lugar de pcpu:

ps aux --sort -%cpu

top ordenar por uso de cpu | ps aux --sort -%cpu

 

 

Utilizar el comando watch junto con ps para monitorizar procesos en tiempo real

 
El comando watch ejecuta un comando periódicamente, mostrando su salida por pantalla cada x segundos.
 
Así, podemos utilizar el comando ps junto con el comando watch, para que cada segundo muestre el resultado del comando ps -e (todos los procesos), añadiendo la opción -o que permite utilizar un formato definido por el usuario (mostrar el pid del proceso, sus ppid, el cmd y el porcentaje de CPU utilizado).
 

Los especificadores de formato los podemos encontrar en el manual del comando ps, en la sección: STANDARD FORMAT SPECIFIERS

comando ps | standard format specifiers

 

 
Así que vamos a lanzar el comando watch con el comando ps y unos especificadores de formato concretos:

watch -n 1 'ps -eo pid,ppid,cmd,%cpu --sort=-%cpu | head'

 

-n : el intervalo en segundos

ps -o : utiliza un formato definido por el usuario.

 

Esto es lo que el anterior comando mostrará por pantalla:

comando watch y comando ps

 

 

el comando vmstat

 

El comando vmstat muestra estadísticas sobre los procesos del sistema, memoria, intercambio, Entrada/Salida y rendimiento de la CPU.
 

vmstat
 

 

¿Qué es lo que nos interesa revisar del resultado de vmstat?

 

Vemos que vmstat muestra varias columnas y dentro de ellas varios valores:

  • procs : r, b
  • memory : swpd, free, buff, cache
  • swap : si, so
  • io : bi, bo
  • system : in, cs
  • cpu : us, sy, id, wa, st

 

 

Vamos a intentar centrarnos en las métricas más importantes de vmstat y su interpretación:

 

  • r (runqueue) : este valor muestra el número de tareas que se ejecutan y esperan recursos de la cpu. Cuando este número excede el número de CPU´s del servidor, puede haber un cuello de botella de CPU, y algunas tareas están esperando su ejecución.
  • b : número de procesos bloqueados en espera de recursos.

 

  • pi (page in – entrada de página) : Cuando este valor es diferente de cero, significa que el servidor ha excedido la memoria RAM disponible, y está usando la memoria de paginación para realizar alguna tarea.

 

  • us (user CPU) : La cantidad de CPU que sirve a las tareas de usuario.
  • sy (system CPU) : el porcentaje de CPU que se utiliza para las tareas de sistema.
  • id (idle – inactivo) : el porcentaje de CPU inactivo.

 

Por defecto, vmstat se ejecuta una vez. este comando es útil cuando observamos su ejecución cada ciertos segundos, y contrastamos los resultados.

Para ello usamos el comando y un número, que serán los segundos entre una ejecución y la siguiente:

vmstat 3

vmstat cada ciertos segundos
 

De esta forma es más fácil observar si nuestra máquina Linux tiene algún problema, quizás observando el número de procesos bloqueados, o la cantidad de memoria física y de intercambio utilizadas.

 

 

Comando Sar (Systat)

 

El comando sar permite monitorizar el rendimiento de la CPU, memoria, E/S .. en tiempo real.

La salida del comando sar muestra :

 

  • %user : porcentaje de utilización de la CPU que se produjo durante la ejecución a nivel de usuario.

 

  • %nice : Porcentaje de utilización de CPU que se produjo mientras se ejecutaba a nivel de usuario con la prioridad de nice.

 

  • %system : Porcentaje de utilización de CPU que se produjo mientras se ejecutaba a nivel de kernel (memoria utilizada por el núcleo del sistema operativo para mantener la función óptima del sistema).

 

  • %iowait : porcentaje de tiempo que las CPU estuvieron inactivas durante las cuales el sistema tuvo una solicitud de E/S de disco pendiente.

 

  • %steal : Porcentaje de tiempo que la CPU o las CPU virtuales pasó en espera involuntaria mientras el hipervisor estaba prestando servicio a otro procesador virtual. Esta categoría de utilización de CPU ocurriría solo en el caso de máquinas virtuales.

 

  • %idle : porcentaje de tiempo que la CPU o las CPU estuvieron inactivas y el sistema no tenía una solicitud de E/S de disco pendiente.

 

 

Las opciones más interesantes de sar , respecto a la monitorización de la CPU son:

 

sar -u: uso de CPU de todas las CPU´s. Muestra el uso de la CPU para el día actual, que se recopiló hasta el momento.

sar -u

 
 
sar -u 1 4 :muestra el uso de la CPU en tiempo real, cada 1 segundo, 4 veces en total.

sar -u 1 4

 

sar -u | uso de la CPU
 
 

sar -u ALL

lo mismo que -u pero muestra campos adicionales
 

sar -u ALL | campos adicionales
 

 

CONCLUSIÓN

 
Existen diversas formas de comprobar el uso de la CPU por los procesos en Linux; hemos visto los comandos:

  • top
  • ps
  • vmstat
  • sar

Cada uno de ellos ofrece diversas y diferentes opciones que permiten comprobar la carga de la CPU en Linux, y revisar qué procesos tienen más consumo en la CPU, que serán de utilidad dependiendo del caso.