Este artículo fue publicado originalmente en go2linux.org. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras.

vmstat (virtual memory statistics) imprime una vista compacta, de una línea por muestra, de procesos, memoria, swap, E/S de disco y CPU. Empecé a usarlo cuando un VPS pequeño que tenía se quedaba sin memoria: el uso de CPU subía hasta que había que reiniciar el servidor, y vmstat mostró que el problema real era el uso de swap.

Es parte del paquete procps y está instalado en prácticamente todos los sistemas Linux.

Uso básico

vmstat [opciones] [intervalo [cantidad]]

intervalo es el número de segundos entre muestras y cantidad es cuántas muestras tomar. Con un intervalo y sin cantidad se ejecuta hasta que presiones Ctrl+C.

vmstat 5 6
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 986900 103532 492096    0    0    24    31  320  943 10  2 87  1  0
 0  0      0 986760 103536 492212    0    0    21     0  714 1706  7  2 91  0  0
 0  0      0 986760 103544 492212    0    0     0     4  877 3647 13  3 85  0  0
 1  0      0 983528 103576 492232    0    0     0    64  667 1816  6  1 93  0  0
 1  0      0 984768 103588 492232    0    0     0     9  767 1979 12  3 85  0  0
 0  0      0 984396 103612 492388    0    0     0    90  942 3215 19  3 77  0  0

La primera línea es distinta de las demás. Muestra promedios desde el último arranque, no el estado actual. Ignórala cuando buscas un problema que está ocurriendo ahora, y nunca ejecutes vmstat sin intervalo para juzgar la carga actual.

Las columnas

procs

  • r — procesos en ejecución o esperando una CPU.
  • b — procesos bloqueados, normalmente esperando E/S.

memory

Los valores están en kibibytes de forma predeterminada.

  • swpd — espacio de swap en uso. Un valor distinto de cero no es un problema por sí solo: el kernel puede haber movido a swap páginas que nadie tocó en días y haberlas dejado ahí.
  • free — memoria que no se usa para nada.
  • buff — búferes, principalmente metadatos del sistema de archivos.
  • cache — la caché de páginas: contenido de archivos leídos o escritos en disco, que se mantiene en memoria por si se necesita de nuevo. Por eso abrir un programa grande por segunda vez es más rápido.

Un valor bajo en free es normal. Linux usa la memoria sobrante como caché y la devuelve en cuanto un programa la necesita. Para saber cuánta memoria está realmente disponible para las aplicaciones, mira la columna available de free -h.

swap

  • si — memoria traída desde el disco (swap in), por segundo.
  • so — memoria enviada al disco (swap out), por segundo.

Estas dos son las columnas que te dicen si al equipo le falta memoria.

io

  • bi — bloques leídos de dispositivos de bloques, por segundo.
  • bo — bloques escritos en dispositivos de bloques, por segundo.

system

  • in — interrupciones por segundo.
  • cs — cambios de contexto por segundo.

cpu

Porcentajes del tiempo total de CPU.

  • us — código de usuario.
  • sy — código del kernel.
  • id — inactivo.
  • wa — inactivo mientras espera que termine una operación de E/S.
  • st — steal: tiempo que el hipervisor dio a otras máquinas virtuales mientras esta quería ejecutarse.

Las versiones recientes agregan una columna gu para el tiempo dedicado a ejecutar máquinas virtuales invitadas.

Cómo interpretarlo

Falta de memoria. si y so están en cero en un sistema sano. Una ráfaga ocasional no es problema. Si se mantienen por encima de cero muestra tras muestra, el sistema está moviendo páginas al disco y de vuelta porque la memoria física no alcanza:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  3 812340  11208    904  23116  620  940  1480  1920  980 2100 12  9 21 58  0
 1  4 818992  10876    872  22640  710 1105  1730  2210 1040 2350 10 11 17 62  0
 3  3 825120  11340    860  21988  655  980  1520  2004 1010 2290 14 10 19 57  0

El swap en uso sigue creciendo, free y cache quedan reducidos a casi nada, y wa es alto porque la CPU está esperando al disco. El servidor parece congelado aunque us sea bajo. La solución es encontrar qué está usando la memoria, reducirlo o agregar memoria.

CPU saturada. Compara r con el número de CPUs (nproc). Si r se mantiene por encima de ese número e id está cerca de cero, hay más trabajo que procesadores.

Cuello de botella de disco. b alto y wa alto con si/so en cero significan que los procesos esperan E/S de disco que no es swap. Continúa con iotop para encontrar el proceso.

Vecinos ruidosos. En un VPS, un valor de st que se mantiene en dos dígitos significa que el servidor anfitrión está sobrevendido o que tu plan tiene la CPU limitada. Nada de lo que cambies dentro de la máquina virtual lo va a arreglar.

Opciones útiles

Salida ancha, para que las columnas no se junten en equipos con mucha memoria:

vmstat -w 5

Mostrar la memoria en mebibytes en lugar de kibibytes:

vmstat -S M 5

Agregar una marca de tiempo a cada línea, útil cuando rediriges la salida a un archivo:

vmstat -t 5

Mostrar memoria activa e inactiva en lugar de búferes y caché:

vmstat -a 5

Una tabla de contadores desde el arranque (memoria total, páginas enviadas a swap, forks, etc.):

vmstat -s

Estadísticas por disco, o el resumen de una partición:

vmstat -d
vmstat -p /dev/sda1

Registrarlo mientras esperas el problema

Cuando el servidor se pone lento a horas impredecibles, deja vmstat registrando y lee el archivo después:

nohup vmstat -t -w 10 > vmstat.log &

Una línea cada diez segundos son unas 8600 líneas al día, lo bastante pequeño como para guardarlo una semana.

Ver también

man vmstat — referencia completa. free -h para un resumen simple de la memoria, y top o htop para ver qué procesos son los responsables.