Monitoreo en linux: top
Mi idea original era hacer un post con un resumen de los comandos de Linux que pueden ser utilizados para diagnosticar algún problema de CPU, memoria o I/O; generalmente este conjunto de comandos está formado por top, iostat, vmstat, netstat, telnet, tail de algún log, cat/grep de algún archivo, y algún otro. Cuando empecé a escribir el post empezó quedar enorme, así que voy a separarlo en pedazos, y hacer algo así como una serie de posts sobre este tema.
El comando top nos provee una vistá dinámica y en tiempo real con la cantidad y estado de los procesos corriendo actualmente, memoria, espacio de swap y los recursos utilizados por cada proceso.
La interfaz es actualizada cada cierto período de tiempo (por defecto, 3segundos). Despliega un resumen del estado del sistema y una lista de los procesos corriendo, de la siguiente manera:
top - 16:26:10 up 2:53, 1 user, load average: 0.01, 0.01, 0.00
Tasks: 46 total, 2 running, 44 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.3%sy, 6.0%ni, 93.0%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 252692k total, 248656k used, 4036k free, 19440k buffers
Swap: 506036k total, 44k used, 505992k free, 188384k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3365 p2p 39 19 42560 21m 4716 S 6.3 8.9 3:32.54 mlnet
4076 root 20 0 2324 1120 888 R 0.3 0.4 0:00.11 top
1 root 20 0 1656 496 456 S 0.0 0.2 0:00.38 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 events/0
5 root 15 -5 0 0 0 S 0.0 0.0 0:00.03 khelper
163 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
Resumen del estado del sistema
En la primer línea tenemos la fecha y hora actual, la cantidad de usuarios utilizando el sistema y la carga del sistema del último minuto, de los últimos 5 minutos y de los últimos 15 minutos respectivamente. Cómo se calcula el load average es un tema en sí mismo, pero básicamente es el promedio de la cantidad de procesos corriendo o prontos para correr en cierto período de tiempo.
Lo que tenemos que saber que a mayor load average, mayor uso de procesador. Un load average de 0 indica que el procesador ha sido muy poco utilizado en ese período de tiempo, mientras que si es mayor, significa que hay más procesos corriendo y prontos para correr que lo que el(los) core(s) pueden procesar. Un load average igual a la cantidad de cores indica un uso óptimo del CPU. Más info acá y acá.
En la segunda línea (Tasks) tenemos la cantidad de procesos y una agregación según el estado de cada uno. Los diferentes estados que muestra son los siguientes:
- Running: procesos corriendo actualmente, o listos para correr en cuanto se les asigne tiempo de CPU.
- Sleeping: el proceso está dormido esperando que ocurra un evento para volver al estado “running”.
- Stopped: La ejecución del proceso está parada; no está corriendo, y no va a volver a correr. Los procesos generalmente entran en este estado cuando reciben señales que no están manejando, y la acción por defecto de las mismas es pasar el proceso a stopped. Esto incluye señales como SIGSTOP, SIGTSTP, SIGTTIN, y SIGTTOU. Una señal de tipo SIGCONT saca al proceso de este estado (ver el comando fg). Con Ctrl+Z mandamos el proceso corriendo en la terminal al background, pasando a estado stopped.
- Zombie: El proceso tampoco está corriendo. Los procesos quedan en este estado cuando su el proceso que los inició murió, ya sea por un error de programación o porque fue matado (ver kill -9).
La tercera línea nos da los porcentajes de uso de procesador, discriminado por “tipo” de uso. Los diferentes tipos significan lo siguiente:
- us: tiempo de procesos de usuario
- sy: tiempo de procesos del sistema (kernel)
- ni: tiempo de procesos del usuario que tienen un “nice” positivo
- wa: tiempo en el cual los procesos están esperando por pedidos de I/O pendientes.
- id: tiempo “idle”, en que no hay procesos requiriendo tiempo de procesador, y tampoco hay pedidos de I/O pendientes.
- st: “steal time”, sólo aplica cuando nuestro Linux corre en una máquina virtual. Es el tiempo que algún proceso de nuestro sistema estaba esperando en la cola de ejecución, pero el hypervisor eligió no darnos tiempo de procesador, y asignarlo a otro procesador virtual.
Si presionamos la tecla ‘1’, top nos muestra las estadísticas de uso discriminado por cada core/procesador:
top - 18:57:22 up 12 days, 5:09, 1 user, load average: 0.03, 0.03, 0.00 Tasks: 174 total, 1 running, 173 sleeping, 0 stopped, 0 zombie Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
La línea siguiente (Mem) detalla las estadísticas de uso de memoria. En ella vemos la memoria total, la memoria utilizada, la memoria libre y la memoria utilizada por como buffers.
Mem: 252692k total, 248656k used, 4036k free, 19440k buffers
La última de las líneas del resumen (Swap) detalla el uso del espacio de swap. Indica cuánto es el espacio de swap total, cuánto está utilizado, cuánto libre y cuánto está siendo utilizado por páginas cacheadas
Swap: 506036k total, 44k used, 505992k free, 188384k cached
Lista de procesos
Luego del resumen del uso de los recursos del sistema top lista los procesos activos, ordenándolos según el uso de procesador.
Las columnas tienen el siguiente significado:
- PID: Process ID
- USER: usuario que inició el proceso
- PR: prioridad del proceso
- NI: nice value. Un valor negativo significa mayor prioridad (hasta -20), un valor positivo, menor prioridad (hasta 19)
- VIRT: Cantidad de memoria virtual utilizada por el proceso (incluyendo datos, código, shared libraries y swap)
- RES: Cantidad de memoria RAM física que el proceso está utilizando
- SHR: Cantidad de memoria compartida. Refleja la memoria que potencialmente podría ser compartida con otros procesos.
- S: Status del proceso. Los posibles estados son ‘D’ (uninterruptible sleep), ‘R’ (running), ‘S’ (sleeping), ‘T’ (traced o stopped) o ‘Z’ (zombie).
- %CPU: porcentaje de CPU utilizado desde la última actualización de la pantalla.
- %MEM: porcentaje de memoria física utilizada por el proceso
- TIME+: Tiempo total de CPU que el proceso ha utilizado desde que se inició.
- COMMAND: comando utilizado para iniciar el proceso.
Se pueden agregar, quitar o cambiar el orden de estas columnas con las teclas f y o.
Interacción con top
Podemos utilizar las siguientes teclas para interactuar con top:
- M – Ordenar por uso de memoria
- P – Ordenar por uso de CPU
- T – Ordenar por tiempo de CPU utilizado
- F – seleccionar campo por el cual ordenar la lista de procesos
- i – mostrar u ocultar procesos idle y zombie
- m, l, t, 1 – muestra u oculta las líneas del resumen (parte de arriba)
- f, o – agregar/quitar columnas, cambiar el orden
- s – cambia el tiempo de actualización de la pantalla (por defecto, 3 segundos)
- z – Colores
- k – Matar un proceso (luego pregunta el PID)
- r – “renice” cambia el nice value de un proceso (luego pregunta el PID)
- q – finalizar
- h – ayuda
Hay algunas más, que se pueden ver en la ayuda del comando o en las man pages.
Referencias
http://www.kernelhardware.org/linux-top-command/
http://www.unix.com/unix-dummies-questions-answers/10157-top-shows-stopped-process.html
http://foros.hackerss.com/lofiversion/index.php/t3914.html
man top
Posts relacionados (generados automáticamente):

Muy buen material! La información me parece muy util y completa. Podrías publicar algo así para ver los comandos para obtener información detallada de uso de recursos de red (conexiones, puertos abiertos, etc)?
Es la idea estimado Omega. En medida que el tiempo lo permita, iré agregando posts sobre las diferentes herramientas que utilizamos para monitorear nuestras aplicaciones que corren en servidores Linux (netstat, iostat, ps, vmstat, etc.). ¡Gracias por tu comentario!