Optimización del disco duro mediante hdparm
hdparm es una utilidad de línea de comandos del sistema operativo GNU/Linux para ver y ajustar los parámetros del hardware de los discos IDE. Podemos ajustar parámetros como los caches del disco, el modo de descanso, el control de energía, gestión acústica y los ajustes DMA.
El comando hdparm no solo te dirá cómo está actuando tu dispositivo, sino que te dejará exprimirlo al máximo.
Si ejecutamos (como root, preferentemente en modo mono-usuario):
hdparm -Tt /dev/hda
veremos algo similar a:
/dev/hda: Timing buffer-cache reads: 128 MB in 1.34 seconds =95.52 MB/sec Timing buffered disk reads: 64 MB in 17.66 seconds =3.58 MB/sec
¿Qué nos dice esto?
El -T significa que se pruebe el sistema de caché (por ejemplo, la memoria, CPU y buffer-cache).
El -t significa que se muestren estadísticas del disco en cuestión, leyendo datos que no se encuentren en la caché.
Los dos parámetros juntos, ejecutados varios veces seguidas en modo mono-usuario, nos darán una idea del rendimiento de nuestro sistema de entrada/salida del disco.
Bueno, veamos algo más de como nuestro Linux está direccionando nuestra unidad:
hdparm /dev/hda /dev/hda: multcount = 0 (off) I/O support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) nowerr = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 1870/255/63, sectors = 30043440, start = 0
Estos son los valores por defecto. Bonitos, seguros, pero no necesariamente los óptimos. ¿Qué es eso del modo 16-bit? ¡Yo pensaba que se abandonó con el 386! ¿Y por qué la mayoría de las opciones se encuentran desactivadas?
Normalmente se considera una buena idea para cualquier distribución instalar de la forma más segura las cosas. Está virtualmente garantizados que los parámetros mostrados en el ejemplo anterior funcionarán con cualquier hardware que nos encontremos. Pero como sabemos que estamos utilizando algo más moderno que una unidad de hace 8 años con 16-bits, hablemos de las opciones interesantes:
multcount: abreviatura de multiple sector count. Esto controla cuantos sectores son leidos del disco en una única interrupción de entrada/salida. Casi todos los dispositivos IDE modernos lo soportan. La página man dice que:
Cuando esta característica es activada, normalmente reduce la carga del sistema operativo para la entrada/salida de un 30% a un 50%. En algunos sistemas además provee de un incremento del rendimiento de datos de un 5% a un 50%.
I/O Support: este es el más importante. Este flag controla como los datos son transferidos del bus PCI al controlador. Casi todos los modernos controladores soportan modo 3, o modo de 32-bits w/sync. Algunos incluso soportan 32-bits async. Activar esto practicamente duplicará el rendimiento.
unmaskIrq: activar esto permitirá a Linux desenmascarar otras interrupciones mientras se esté procesando una interrupción de disco. ¿Qué significa esto? Permite a Linux atender otras tareas relacionadas con interrupciones (por ejemplo, el tráfico de red) mientras se espera a que el disco devuelva los datos que se le pidieron. Podría incrementar el tiempo de respuesta del sistema, pero cuidado: no todas las configuraciones de hardware serán capaces de controlar esto. Para más información consultar la página man correspondiente.
using_dma: usar DMA puede ser algo difícil. Si puedes hacer que tu dispositivo utilice DMA, hazlo. Pero he visto más de una máquina colgarse mientras se jugaba con esta opción. De nuevo, consultar la página man es lo adecuado (junto con el siguiente ejemplo).
Una vez tenemos nuestro sistema en modo mono-usuario, como un buen pequeño administrador, intentemos algunos cambios:
hdparm -c3 -m16 /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 multcount = 16 (on) I/O support = 3 (32-bit w/sync)
¡Bien! Suena bien eso de 32-bit. Y algunas multilecturas nos ayudarán. Volvemos a realizar la prueba:
hdparm -tT /dev/hda /dev/hda: Timing buffer-cache reads: 128 MB in 1.41 seconds = 90.78 MB/sec Timing buffered disk reads: 64 MB in 9.84 seconds = 6.50 MB/sec
Se pueden realizar bastantes más cambios y pruebas, pero cada vez que reiniciemos se perderán. Por lo tanto se debería añadir el comando anterior a los scripts /etc/rc.d/* una vez estemos seguros de que el sistema es estable (y preferentemente después de que fsck se haya ejecutado).
Por último veamos ahora algunas características útiles que se pueden activar:
* Activar el modo "read ahead" para acelerar lecturas secuenciales: $ sudo hdparm -A1 /dev/sda * Activar el modo DMA: $ sudo hdparm -d1 /dev/sda * Activar el modo PIO: $ sudo hdparm -p4 /dev/sda * Activar el acceso a disco de 32bits: $ sudo hdparm -c1 /dev/sda * Activar la lectura de multiples sectores: $ sudo hdparm -m16 /dev/sda (aquí lo mejor es usar el valor de MaxMultSect que vemos al hacer $ sudo hdparm -i /dev/sda) * Establecer el modo de acceso UDMA: sudo hdparm -Xudma6 /dev/sda
Otra opción para no perder los cambios es escribir la configuración en /etc/hdparm.conf. El siguiente sirve como ejemplo:
/dev/hda { mult_sect_io = 16 write_cache = on dma = on io32_support = 1 read_ahead_sect = 128 } /dev/cdrom { dma = on interrupt_unmask = on io32_support = 1 }