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
nTasks: 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

Bookmark the permalink.

7 respuestas a Monitoreo en linux: top

  1. El Omega says:

    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)?

    • jarrarte says:

      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!

  2. Pablo Cardozo says:

    Hola José, buscando el tema de cambiar el orden de las columnas hallé tu sitio, y me pareció super interesante, y por más que es un tema que tiene ya más de un año, me gustaría saber si puedes responderme de cómo hacer que los cambios que haga en la forma de ver las columnas se puede mantener para siempre. Mi idea es poder tener el nombre del comando al lado del pid porque siempre lo uso para matar algún proceso y tengo que mirar de un lado a otro para saber qué corresponde con qué. Si me puedes ayudar en eso te lo agradecería mucho. Un abrazo!

    • jarrarte says:

      Hola Pablo, ¿cómo estás?

      Puedes agregar o eliminar columnas accediendo al menú de la tecla ‘f’. Luego de agregar o quitar las columnas puedes reordenarlas accediendo al menú de la tecla ‘o’.

      Si necesitas conocer cuál es el PID de un proceso determinado también puedes investigar el comando ‘ps -aef | grep [PROCESO]’, donde [PROCESO] es el nombre, la ruta o algún parámetro del proceso que quieras matar.

      Saludos

    • Anomino says:

      Aunque ya ha pasado mucho tiempo de este post, dejo aqui la solucion, para guardar la configuracion de las columnas del comando top, añades las columnas que quieras, le das a intro y luego a SHIFT + w
      y te saldra un mensaje parecido a este :

      Wrote configuration to ‘/home/user/.toprc’

      y cada vez que entres te apareceran las columnas seleccionadas.

      saludos,

  3. Muchas gracias por el resumen, era justo lo que buscaba, me ha sido muy útil… (imprimiendo)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *