Marcio Cunha

¿Servidor lento? Cómo hallar cuellos de botella con iostat

Aprenda a diagnosticar cuellos de botella de entrada y salida (I/O) en Linux. Descubra cómo interpretar la métrica iowait de CPU, calcular la latencia de disco y analizar colas de escritura en tiempo real con iostat.

Marcio Cunha•5 min
También disponible en:PortuguêsEnglish
Resumen
  • La métrica de iowait elevada en CPU indica que el procesador está inactivo esperando datos lentos del disco.
  • La columna %util muestra el porcentaje de tiempo activo del disco, pero unidades NVMe modernas pueden atender peticiones en paralelo aun marcando 100%.
  • El tiempo de respuesta real percibido por la aplicación depende principalmente de las métricas w_await y r_await del iostat.
  • Valores de cola superiores a cero en la columna aquesz demuestran acumulación de solicitudes y limitaciones del hardware.
  • Identificar el dispositivo saturado permite hacer ajustes en la base de datos o en el almacenamiento sin gastar en hardware innecesario.

Qué ocurre cuando el disco se convierte en el cuello de botella

Cuando una aplicación responde con lentitud o el sistema parece congelarse sin un uso elevado de CPU, el principal sospechoso suele ser el subsistema de almacenamiento. El sistema operativo lee y escribe datos constantemente en discos mecánicos o unidades de estado sólido. Cuando estos dispositivos alcanzan el límite de operaciones por segundo, el procesador entra en estado de espera. En servidores de bases de datos o sistemas de archivos con alta demanda, identificar la causa de este retraso es el primer paso para recuperar la estabilidad.

Para supervisar la actividad de entrada y salida, conocida técnicamente como I/O (Input/Output), Linux cuenta con la herramienta iostat. Esta utilidad forma parte del paquete sysstat y muestra cómo la CPU y los discos gestionan las peticiones del sistema. Si ya ha analizado problemas de rendimiento en unidades avanzadas, como explicamos al identificar cuellos de botella de I/O en discos NVMe en Linux, verá que iostat es la herramienta fundamental para rastrear el comportamiento en cualquier tipo de almacenamiento.

Comprendiendo el impacto de iowait en la CPU

Al ejecutar utilidades como top o htop, los administradores suelen observar un porcentaje alto de CPU clasificado como wa o iowait. El concepto iowait mide el tiempo en que la CPU permanece inactiva esperando a que el disco complete operaciones de lectura o escritura. Tener un iowait alto no significa que la CPU esté sobrecargada de trabajo; al contrario, indica que el procesador está detenido esperando a que responda un hardware de almacenamiento más lento.

Es esencial monitorear los procesos que se quedan bloqueados en esta fase. Cuando las tareas sufren retrasos por la lentitud del disco, pasan a un estado de espera ininterrumpible en el sistema operativo. Para entender cómo se relacionan estas peticiones retenidas con la falta de recursos, puede consultar cómo hallar procesos zombis en Linux y liberar la CPU, evitando que el acopio de procesos afecte al resto del servidor.

Cómo instalar y ejecutar iostat en tiempo real

La herramienta iostat se instala fácilmente en casi todas las distribuciones Linux mediante el paquete sysstat. Para inspeccionar el comportamiento actual y omitir el promedio histórico acumulado desde el inicio del sistema, debemos especificar un intervalo de actualización en segundos al ejecutar el comando.

  1. Instale el paquete sysstat mediante el gestor de paquetes de su distribución:
    sudo apt update && sudo apt install sysstat -y
  2. Inicie el comando iostat solicitando estadísticas extendidas en megabytes por segundo cada 2 segundos:
    iostat -xz 2
  3. Revise las columnas impresas en la consola para identificar la unidad con mayor latencia o acumulación de trabajo.

Interpretación de las métricas clave de iostat

La vista extendida (-x) proporciona múltiples columnas explicativas. A continuación, detallamos el significado práctico de cada indicador principal:

Device            r/s     w/s     rMB/s     wMB/s   r_await   w_await   aqu-sz  %util  sda             45.00  120.00      1.20     15.40      4.20     35.50     4.80  98.50  nvme0n1          12.00   85.00      0.40      8.10      0.30      0.80     0.10  15.00

Las columnas r/s y w/s expresan las lecturas y escrituras completadas por segundo. Las columnas rMB/s y wMB/s representan la tasa de transferencia de datos. Sin embargo, las métricas más decisivas para diagnosticar problemas graves son r_await, w_await, aqu-sz y %util.

La métrica w_await mide la latencia media en milisegundos que toma una escritura desde su llegada a la cola hasta ser confirmada por el hardware. Si w_await o r_await superan los 10 o 20 ms en discos SSD o los 50 ms en discos mecánicos, la aplicación sufrirá una ralentización notable. La columna aqu-sz refleja la longitud media de la cola de peticiones pendientes. Valores sostenidos superiores a 1 o 2 indican que el almacenamiento no logra procesar la carga al ritmo con que se genera.

La trampa de la columna %util en discos modernos

En el pasado, la columna %util reflejaba el porcentaje de tiempo que el disco permanecía ocupado atendiendo peticiones. Un valor cercano al 100% en discos mecánicos significaba saturación completa del cabezal de lectura. Sin embargo, en SSDs modernos y unidades NVMe capaces de procesar múltiples colas en paralelo, %util puede llegar a 100% mientras el dispositivo conserva margen de procesamiento disponible.

Por esta razón, nunca tome decisiones basándose únicamente en %util. Evalúe siempre los tiempos de respuesta (r_await y w_await) junto con el tamaño de cola (aqu-sz). Si la latencia es reducida y las colas son pequeñas, el almacenamiento funcionará de forma óptima aunque %util registre cifras elevadas. Para profundizar en estos conceptos arquitectónicos en producción, consulte también nuestro análisis técnico sobre Cómo medir ripple en fuentes de banco con un osciloscopio.

Diagnóstico y soluciones para resolver el cuello de botella

Tras identificar un disco con valores elevados de w_await y colas en aumento, la solución depende de la causa del tráfico. En servidores con bases de datos como PostgreSQL o MySQL, conviene verificar si existen consultas sin índices que obliguen a leer bloques de forma masiva o si las escrituras de logs están colapsando la unidad. En entornos con contenedores, la inspección por proceso con herramientas como iotop facilita ubicar la aplicación concreta que genera el consumo.

Si el límite de almacenamiento es real debido al volumen del servicio, aplicar estrategias como separar cargas en volúmenes independientes (por ejemplo, situar archivos de registros en un disco distinto), ajustar parámetros de caché de memoria en el kernel (como vm.dirty_ratio) o migrar a discos con mayores IOPS resolverá el problema de forma definitiva.