¿Cómo solucionar problemas de rendimiento de I/O de disco en Linux?

Los problemas de rendimiento de I/O (entrada/salida) de disco pueden afectar significativamente el rendimiento de un servidor Linux, especialmente en aplicaciones que requieren muchos recursos como bases de datos o servidores de archivos. Identificar y solucionar problemas de I/O de disco implica usar una combinación de herramientas y técnicas para localizar cuellos de botella, configuraciones incorrectas o fallos de hardware. A continuación, se presentan varios pasos para ayudar a solucionar problemas de rendimiento de I/O de disco en su servidor Linux.

1. Verificar el uso del disco con df

Antes de profundizar en la solución de problemas específicos de I/O, verifique si el disco está lleno o cerca de llenarse, ya que esto podría afectar el rendimiento.

$ df -h

Este comando muestra el uso del espacio en disco de todos los sistemas de archivos montados.

Ejemplo de salida:

Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 30G 18G 63% / tmpfs 16G 1.6G 15G 10% /dev/shm /dev/sdb1 100G 25G 70G 27% /data

Si el uso del disco es alto (especialmente el valor de "Use%"), considere liberar espacio o ampliar el almacenamiento.

2. Monitorear el I/O de disco con iostat

El comando iostat, proporcionado por el paquete sysstat, ofrece información detallada sobre el rendimiento del disco, incluyendo velocidades de lectura/escritura, operaciones de I/O y la carga general del sistema.

$ iostat -x 5

La opción -x proporciona estadísticas extendidas, y el 5 especifica un intervalo de 5 segundos entre los informes.

Ejemplo de salida:

Linux 5.4.0-74-generic (hostname) 12/26/2024 _x86_64_ (8 CPU)
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await svctm %util sda 10.1 8.2 1040 750 0.0 0.0 0.1 0.1 10.0 15.0 1.2 25.0 sdb 3.5 2.2 400 250 0.0 0.0 0.1 0.0 30.0 35.0 1.5 10.0
  • r/s: Lecturas por segundo
  • w/s: Escrituras por segundo
  • rkB/s: Kilobytes leídos por segundo
  • wkB/s: Kilobytes escritos por segundo
  • %util: Porcentaje de tiempo que el dispositivo estuvo ocupado (un valor alto sugiere que el disco está muy utilizado)

Busque una alta utilización o demoras, lo que indica un posible cuello de botella.

3. Verificar errores de disco con dmesg

Los errores de disco pueden degradar significativamente el rendimiento. Use el comando dmesg para buscar mensajes del sistema relacionados con errores de disco o problemas de I/O.

$ dmesg | grep -i error

Si hay errores relacionados con el disco, generalmente aparecerán aquí, incluyendo problemas como tiempos de espera de I/O o fallos de hardware.

Ejemplo de salida:

[42615.217683] sd 2:0:0:0: [sda] Unhandled sense code
[42615.217707] sd 2:0:0:0: [sda] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE [42615.217719] sd 2:0:0:0: [sda] Sense Key : Hardware Error [current]

4. Medir la latencia de disco con blktrace

blktrace es una herramienta de bajo nivel que rastrea las operaciones de I/O del bloque. Esta herramienta proporciona información detallada sobre cuánto tiempo tarda el sistema en leer o escribir datos en el disco.

  1. Instale blktrace:

    $ sudo apt-get install blktrace
  2. Inicie el rastreo del disco (reemplace /dev/sda con su dispositivo):

    $ sudo blktrace -d /dev/sda -o - | blkparse -i -

Esto generará información detallada sobre las operaciones de I/O y sus latencias.

Ejemplo de salida:

0,0 10.984523 563 I/O 4096 READ
0,0 10.984731 564 I/O 4096 WRITE 0,0 10.985035 565 I/O 4096 READ

Busque valores de latencia altos, lo que indica que las operaciones de disco están tardando más de lo habitual.

5. Analizar la longitud de la cola de discos con sar

El comando sar, parte del paquete sysstat, puede mostrar métricas históricas de rendimiento de discos, incluyendo la longitud de la cola de discos.

$ sar -d 5 5

Esto mostrará la actividad del disco cada 5 segundos durante 5 intervalos, incluyendo el promedio de la longitud de la cola.

Ejemplo de salida:

Linux 5.4.0-74-generic (hostname) 12/26/2024 _x86_64_ (8 CPU)
Time tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 15:30:01 30.0 1024 1024 68.0 0.20 12.0 10.0 25.0 15:30:06 28.0 900 1000 60.0 0.15 11.0 9.0 22.0
  • avgrq-sz: Tamaño promedio de la solicitud
  • avgqu-sz: Longitud promedio de la cola
  • await: Tiempo promedio de espera por solicitud
  • %util: Porcentaje de tiempo en que el disco estuvo ocupado

Un tamaño de cola promedio alto o un tiempo de espera alto pueden indicar problemas de rendimiento de disco.

7. Verificar la salud del disco con smartctl

Los fallos o problemas de salud de los discos pueden causar una degradación del rendimiento de I/O. Use smartctl del paquete smartmontools para verificar la salud de sus discos.

$ sudo smartctl -a /dev/sda

Ejemplo de salida:

SMART Status: OK
Temperature: 38 C (good) Reallocated_Sector_Ct: 0 (good) Power_On_Hours: 2400 (good)

Si hay algún error SMART, podría indicar un disco defectuoso.

8. Revisar la configuración del disco

Si está utilizando RAID de software o LVM, asegúrese de que la configuración sea óptima. Verifique si hay arrays RAID degradados o grupos de volúmenes mal configurados que puedan afectar el rendimiento.

Para RAID, use:

$ cat /proc/mdstat

Para LVM, use:

$ sudo vgs
$ sudo lvs

Conclusión

Usando estas herramientas y técnicas, puede diagnosticar y solucionar problemas de rendimiento de I/O de disco en su servidor Linux. Comience con verificaciones básicas como el espacio en disco y el uso de la CPU, luego pase a herramientas más avanzadas como iostat, dmesg y blktrace. Identificar la causa raíz le ayudará a optimizar el rendimiento del disco y evitar futuros problemas.