Supervisión de E/S de disco con iostat y dstat: detección de cuellos de botella
Introducción
La supervisión de las operaciones de entrada-salida del disco es una de las tareas clave a la hora de gestionar servidores en una infraestructura de alojamiento. El subsistema de disco afecta directamente al rendimiento de los servicios web, las bases de datos, las máquinas virtuales, los contenedores y las tareas en segundo plano. Incluso con suficiente memoria RAM y recursos de CPU libres, un disco sobrecargado o lento puede convertirse en el cuello de botella de todo el sistema.
Este manual está dirigido a administradores de sistemas, ingenieros de DevOps y propietarios de servidores. Abarca las utilidades iostat y dstat, los principios de su funcionamiento, la interpretación de las métricas y un enfoque práctico para detectar cuellos de botella de E/S de disco en un entorno de alojamiento.
Información general y principios de funcionamiento
E/S de disco en una infraestructura de servidores
La entrada-salida de disco incluye operaciones de lectura y escritura de datos en dispositivos de bloques. En escenarios reales de alojamiento, la carga en el subsistema de disco suele generarse principalmente por:
- bases de datos (MySQL, MariaDB, PostgreSQL);
- aplicaciones web con contenido dinámico;
- servicios de correo;
- copias de seguridad y sincronización de datos;
- registro de eventos;
- archivos de intercambio y temporales;
- scripts de usuario y tareas cron.
Pueden producirse cuellos de botella debido a dispositivos de almacenamiento lentos, una alta contienda entre procesos, programadores de E/S no óptimos, un funcionamiento incorrecto del almacenamiento en caché o funciones de virtualización.
Finalidad de iostat y dstat
iostat es una utilidad del paquete sysstat diseñada para recopilar estadísticas detalladas sobre la carga de la CPU y de los dispositivos de disco. La tarea principal de iostat es mostrar la intensidad con la que se está utilizando un disco concreto, si hay una cola de peticiones y cuál es el tiempo medio de espera de las operaciones.
dstat es una herramienta de monitorización versátil que muestra estadísticas en tiempo real de varios subsistemas a la vez: CPU, memoria, disco, red y procesos. Permite correlacionar la actividad del disco con la carga global del servidor y resulta muy útil para realizar diagnósticos rápidos.
Estas utilidades se complementan entre sí: iostat ofrece una visión precisa a nivel de dispositivo, mientras que dstat proporciona el contexto de todo el sistema.
Requisitos previos y condiciones
Antes de iniciar el análisis, deben cumplirse las siguientes condiciones:
- Sistema operativo Linux (Debian, Ubuntu, AlmaLinux, Rocky Linux, CentOS).
- Acceso SSH al servidor.
- Privilegios de root o la capacidad de ejecutar comandos mediante sudo.
Comprobación de la versión del sistema operativo:
cat /etc/os-release
Instalación de los paquetes necesarios:
Debian / Ubuntu:
sudo apt update sudo apt install sysstat dstat
CentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install sysstat dstat # or sudo dnf install sysstat dstat
Comprobación del funcionamiento de sysstat:
systemctl status sysstat
Si el servicio está activo, se mostrará la información pertinente:
root@server:~# systemctl status sysstat ● sysstat.service - Resets System Activity Logs Loaded: loaded (/usr/lib/systemd/system/sysstat.service; enabled; preset: enabled) Active: active (exited) since Tue 2025-12-23 10:35:35 UTC; 16min ago Docs: man:sa1(8) man:sadc(8) man:sar(1) Main PID: 731 (code=exited, status=0/SUCCESS) CPU: 7ms
Revisión y análisis paso a paso
Análisis básico del disco con iostat
La utilidad iostat se utiliza para evaluar la carga de la CPU y del subsistema de disco, así como para identificar retrasos y colas de E/S.
Sintaxis:
sudo iostat [options] [interval] [count]
Parámetros más utilizados:
- -x: estadísticas ampliadas;
- -d: datos solo del disco;
- -k: salida en kilobytes;
- -p: estadísticas de particiones o de un dispositivo específico.
Ejemplo básico:
sudo iostat -x
Análisis dinámico:
sudo iostat -xk 5 3
El intervalo y el número de muestras permiten realizar un seguimiento de los cambios en la carga a lo largo del tiempo, en lugar del estado medio desde el arranque del sistema.
Ejemplo de salida de iostat

Métricas clave de la CPU:
- %iowait: el porcentaje de tiempo que la CPU permanece inactiva mientras espera operaciones de E/S. Un aumento de esta métrica indica el impacto del disco en el rendimiento general.
- %steal: relevante para servidores virtuales, muestra el tiempo de CPU «robado».
Métricas clave del disco:
- %util: porcentaje de tiempo en que el disco ha estado ocupado. Los valores que superan de forma constante el 80-90 % indican saturación del dispositivo.
- r_await: el tiempo medio (ms) que tardan en completarse las operaciones de lectura (incluido el tiempo de cola).
- w_await: el tiempo medio (ms) que tardan en completarse las operaciones de escritura (incluido el tiempo de cola).
- aqu-sz: (tamaño medio de la cola) longitud media de la cola de solicitudes del disco. Un valor > 1 ya indica que se está formando una cola. Un valor > 2-4 para discos duros (HDD) o > 1-2 para discos SSD es señal de que el disco no está dando abasto con la carga.
La diferencia entre «await» y «svctm» indica si el retraso se debe a la cola, en lugar de a la velocidad física del disco.
Si «await» solo supera ligeramente a «svctm» (diferencia < 20-30 %), los retrasos se deben principalmente al propio disco (lectura/escritura física lenta).
Si «await» es significativamente mayor que «svctm» (diferencia > 50-100 %), el retraso principal se debe a la cola de solicitudes (el valor de «aqu-sz» será elevado), lo que indica una sobrecarga del disco debido a numerosas solicitudes paralelas.
En las versiones modernas de iostat (como en el ejemplo), no se muestra «svctm» porque su cálculo no es fiable. Para el análisis, se utiliza la combinación de «await» + «aqu-sz»: un valor alto de «await» con un valor bajo de «aqu-sz» (~0) indica que el disco es lento; un valor alto de «await» con un valor alto de «aqu-sz» (>1) indica que el disco está sobrecargado de solicitudes.
Análisis de la situación general con dstat
Se utiliza dstat para la observación del sistema en tiempo real y para correlacionar la carga del disco con otros recursos.
Ejemplos de comandos:
dstat -d dstat --disk-util dstat -rd --disk-util dstat -D vda,sda
Ejemplo de ejecución con un intervalo:
dstat -rd --disk-util 1 5
Al realizar el análisis, presta atención a:
- el aumento de iowait en la CPU;
- picos de lectura o escritura;
- la actividad simultánea de la red y del disco (copias de seguridad, sincronización).
Example dstat output: dstat -rd --disk-util 1 5 --io/total- -dsk/total- vda- read write| read write|util 0 4.00 | 0 76k|0.50 0 29.5 | 0 240k|0.20 0 1.00 | 0 4096B| 0 0 0 | 0 0 | 0 0 1.00 | 0 32k| 0
Comparación entre dstat e iostat:
| Criterios | iostat | dstat |
|---|---|---|
| Precisión de los datos | Alta | Alta |
| Modo en tiempo real | Limitada | Excelente |
| Datos históricos | Sí (sar) | No |
| Salida en color | No | Sí |
| Ampliabilidad | No | Complementos |
| Exportación a CSV | No | Sí |
| Carga de la CPU | Baja | Media |
dstat resulta especialmente útil para detectar picos de carga a corto plazo que no siempre se aprecian en iostat.
Identificación de cuellos de botella en la E/S del disco
Los siguientes comandos se utilizan para realizar diagnósticos rápidos:
sudo iostat -mx 2 sudo iostat -p /dev/vda 2 5 sar -d 1 5
Señales típicas de un problema:
- %util por encima del 80 % durante un periodo prolongado;
- un tiempo de espera superior a 20-30 ms para SSD o superior a 50-100 ms para HDD;
- un valor de aqu-sz superior a 2-3, lo que indica acumulación de colas.
En el ejemplo se utiliza el disco /dev/vda; se trata de un disco virtual (VirtIO) en un servidor virtual.
En servidores físicos y en otros entornos, los discos pueden tener nombres diferentes:
- /dev/sdX (p. ej., /dev/sda): discos SATA/SAS/USB normales
- /dev/nvmeXnY (p. ej., /dev/nvme0n1): unidades NVMe
- /dev/vdX: discos virtuales
Identificación de los procesos que provocan una elevada carga de E/S de disco
Una vez constatada la sobrecarga del subsistema de disco mediante iostat y dstat, el siguiente paso es identificar los procesos específicos que inician operaciones intensivas de lectura o escritura. El análisis a nivel de dispositivo sin identificar la fuente de la carga no permite adoptar las medidas correctivas adecuadas.
Uso de iotop
La herramienta principal para localizar los procesos que están utilizando activamente el disco es la utilidad iotop.
sudo iotop -ao
Parámetros del comando:
-a: muestra estadísticas acumuladas desde que se inició el proceso, lo que ayuda a identificar tareas en segundo plano con E/S prolongadas;
-o: muestra únicamente aquellos procesos que están realizando operaciones de E/S en ese momento.
Ejemplo de salida:
TID 41PRIO USER41DISK READ41DISK WRITE41SWAPIN41IO>4141COMMAND 1105641be/441mysql410.00 B 413.44 M410.00 %410.76 %41mysqld 258041be/441rsync410.00 B4123.48 M410.00 %411.17 %41rsync
En la salida de iotop, hay que prestar especial atención a los campos DISK READ, DISK WRITE y al porcentaje de tiempo de E/S. Normalmente, las fuentes de carga son procesos de bases de datos, procesos de copia de seguridad, procesos de sincronización de archivos o scripts de usuario.
Uso de pidstat para el análisis de E/S por proceso
Para un análisis más formalizado y repetible, se puede utilizar pidstat, que forma parte del paquete sysstat.
pidstat -d 1
Este comando muestra estadísticas de E/S de disco para cada proceso a intervalos de un segundo. Esto resulta útil para identificar picos de actividad a corto plazo y correlacionarlos con otras métricas del sistema.
pidstat resulta especialmente útil en situaciones en las que la carga aparece periódicamente y es posible que iotop no siempre la detecte.
Uso de lsof para el análisis de la actividad de los archivos
En los casos en los que sea necesario comprender con qué archivos o directorios concretos está trabajando un proceso, se utiliza la utilidad lsof.
lsof +D /path
Donde/path es un directorio específico en el que es necesario identificar los archivos y procesos activos. Por ejemplo, podría tratarse de un directorio de base de datos, un directorio de copias de seguridad o un área de archivos temporales.
El comando permite determinar qué procesos mantienen actualmente descriptores de archivo y están realizando operaciones dentro de la ruta especificada, lo cual resulta especialmente útil a la hora de analizar la carga generada por las aplicaciones.
Análisis del contexto de la carga
Identificar un proceso con una elevada actividad de disco no es el objetivo final. El administrador debe evaluar el contexto de su funcionamiento:
- ¿es la carga esperada para este servicio?;
- ¿se está ejecutando el proceso en un momento adecuado (p. ej., copias de seguridad durante las horas punta)?;
- ¿se pueden modificar la programación o los parámetros operativos?;
- ¿es admisible reducir la prioridad de E/S?
Este enfoque permite distinguir entre una carga normal y una carga problemática, así como elegir el método de optimización adecuado.
Verificación de la corrección del análisis
La corrección del análisis realizado se confirma si:
- los picos en %util, await o aqu-sz en iostat coinciden en el tiempo con la actividad de los procesos en iotop o pidstat;
- el aumento de «iowait» en «dstat» coincide con las operaciones de disco, y no con la carga de la CPU;
- las mediciones repetidas muestran un patrón de carga reproducible.
Para la recopilación de datos y su posterior análisis, se recomienda utilizar el registro:
sar -d 1 100 > io.log
Esto permite registrar el comportamiento del subsistema de disco durante un periodo determinado y utilizar los datos a la hora de investigar incidencias.
Errores habituales y características operativas
En la práctica del funcionamiento de los servidores de alojamiento, los siguientes problemas son los más habituales:
- ejecutar copias de seguridad y sincronizaciones de datos durante las horas punta;
- uso intensivo del espacio de intercambio cuando no hay suficiente RAM;
- un programador de E/S inadecuado para el tipo de unidad;
- falta de priorización de las tareas en segundo plano.
Para reducir el impacto de los procesos en segundo plano sobre el rendimiento, se recomienda utilizar la utilidad ionice para gestionar la prioridad de E/S de un proceso, lo que permite disminuir el impacto de las tareas en segundo plano sobre la capacidad de respuesta del sistema.
Ejemplo de uso:
ionice -c3 rsync /source /destination
Prioridades clave:
- -c1 (tiempo real): la prioridad más alta. Se utiliza para tareas en las que la latencia es crítica. Puede bloquear por completo otros procesos.
- -c2 (mejor esfuerzo): el valor predeterminado para la mayoría de los procesos. Permite ajustar el nivel de prioridad (de 0 [alto] a 7 [bajo]).
- -c3 (inactivo): en segundo plano. El proceso solo tendrá acceso al disco cuando ningún otro proceso lo esté utilizando. Es seguro y recomendado para operaciones en segundo plano (copias de seguridad, sincronización de datos).
En este ejemplo, el proceso rsync se ejecuta con la prioridad de E/S más baja, lo que minimiza su impacto en las operaciones principales del sistema. El uso de ionice permite minimizar el impacto de los procesos en segundo plano sin necesidad de desactivarlos por completo.
Conclusión
La supervisión de la E/S de disco es una parte fundamental del mantenimiento del rendimiento y la estabilidad de una infraestructura de servidores. Las utilidades iostat y dstat permiten identificar situaciones de sobrecarga y evaluar el estado del subsistema de disco, mientras que herramientas como iotop, pidstat y lsof ayudan a identificar procesos específicos y la naturaleza de su carga.
La aplicación regular del enfoque descrito, la interpretación correcta de las métricas y la gestión de las prioridades de E/S ayudan a reducir los tiempos de respuesta del servicio, a aumentar la previsibilidad de la carga y a garantizar el cumplimiento de los requisitos del SLA. Posteriormente, esta metodología puede ampliarse mediante la supervisión centralizada y la automatización del análisis de la carga de E/S.