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
- %CPU e idle
- Interpretaciones de Load Average
- Usando filtros en top para filtrar por porcentaje de CPU.
- Otros campos (fields) que muestra el comando top.
- Comando ps
- Diferenciación básica: BSD vs UNIX.
- Mostrar todos los procesos.
- Mostrar info detallada de los procesos.
- Ordenando la salida del comando ps, según el consumo de CPU.
- Utilizar el comando watch junto al comando ps para monitorizar procesos en tiempo real.
- Comando Sar (Systat)
El comando top
El comando top muestra datos relacionados con el rendimiento del sistema. Por defecto se actualiza cada 5 segundos.
-
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.
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 |
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ú,
y veremos el nuevo resultado del filtrado que hará top:
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.
Mostrar todos los procesos con ps:
- ps ax
- ps -e
salida del comando:
ps ax |
salida del comando:
ps -e |
Mostrar info detallada de los procesos:
- usando la opción u :
- usando la opción -f :
ps aux |
ps -ef |
salida del comando:
ps aux |
salida del comando:
ps-ef |
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):
pcpu es compatible con %cpu, según los especificadores standard de formato (STANDARD FORMAT SPECIFIERS):
Aquí vemos el resultado de la salida ordenada, usando %cpu en lugar de pcpu:
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
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:
el comando vmstat
El comando vmstat muestra estadísticas sobre los procesos del sistema, memoria, intercambio, Entrada/Salida y rendimiento de la CPU.
¿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 |
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 ALL |
lo mismo que -u pero muestra 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.