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.

6. 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.

7. 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.