lunes, julio 03, 2006

Acelerar los discos con hdparm

Para empezar con el tema de los discos duros, y dado que los dispositivos de almacenamiento secundario son un verdadero cuello de botella en la ejecución, vamos a intentar optimizar el acceso utilizando para ello la herramienta hdparm. Primero vamos a comprobar la velocidad actual de transferencia con y sin buffer:

$ sudo hdparm -tT /dev/hdg

por supuesto, habrá que sustituir /dev/hdg por el disco sobre el que se quiera realizar la prueba. El sistema responde:

/dev/hdg:
Timing buffer-cache reads: 644 MB in 2.01 seconds = 320.13 MB/sec
Timing buffered disk reads: 138 MB in 3.01 seconds = 45.81 MB/sec

Muchas veces se desactivan opciones que mejorarían el rendimiento de acceso a disco por mantener la compatibilidad. Comprobemos la configuración actual:

$ sudo hdparm /dev/hdg

lo cual muestra:

/dev/hdg:
multcount = 0 (off)
IO_support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 65535/16/63, sectors = 234375000, start = 0

Lo primero en lo que tenemos que fijarnos es en si está activado o no el acceso directo a memoria (DMA), la opción using_dma. Esta opción posibilita al controlador de disco acceder directamente a la memoria del sistema para realizar transferencias, liberando a la CPU de ese trabajo.

En este caso como vemos DMA está activo. Si no lo estuviera escribiríamos:

$ sudo hdparm -d1 /dev/hdg

A continuación vamos a activar las transferencias de 32 bits, ya que como vemos (opción IO_support) por defecto solo se utilizan 16 bits:

$ sudo hdparm -c3 /dev/hdg
/dev/hdg:
setting 32-bit IO_support flag to 3
IO_support = 3 (32-bit w/sync)

También podríamos haber utilizado la opción -c1 en lugar de -c3, que indica al sistema que realice las transferencias de 32 en 32 bits, como -c1, pero sin activar una cierta secuencia de sincronización necesaria por parte de algunos sistemas. El sustituir -c3 por -c1 puede provocar una ligera mejora en las prestaciones, pero a cambio puede dar problemas dependiendo del dispositivo.

Por último, vamos a indicar al sistema que lea varios sectores en la misma interrupción, utilizando para ello la opción -m. Valores comunes suelen ser 2, 4, 8 o 16, aunque valores mayores pueden ser posibles. Para comprobar el límite para el dispositivo utilizaremos la opción -i:

$ sudo hdparm -i /dev/hdg
/dev/hdg:
Model=WDC WD1200JB-75CRA0, FwRev=16.06V16, SerialNo=WD-WMA8C2958000
Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
RawCHS=16383/16/63, TrkSize=57600, SectSize=600, ECCbytes=40
BuffType=DualPortCache, BuffSize=8192kB, MaxMultSect=16, MultSect=off
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234375000
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2
AdvancedPM=no WriteCache=enabled
Drive conforms to: device does not report version:

* signifies the current active mode

Como vemos el valor máximo para el dispositivo hdg es 16, por lo que activaremos la lectura de 16 sectores por interrupción:

$ sudo hdparm -c3 -m16 /dev/hdg
/dev/hdg:
setting 32-bit IO_support flag to 3
setting multcount to 16
multcount = 16 (on)
IO_support = 3 (32-bit w/sync)

Una vez realizados los cambios, si eran necesarios, volvemos a realizar las pruebas de velocidad para comprobar si ha habido un aumento en la velocidad de acceso:

$ sudo hdparm -tT /dev/hdg

en el caso de que así sea, procederemos a guardar los cambios, bien utilizando la opción -k1 o editando el archivo de configuración /etc/hdparm.conf y añadiendo algo parecido a esto:

/dev/hdg {
dma = on
mult_sect_io = 16
io32_support = 3
}

No hay comentarios.: