martes, abril 26, 2005

Jugando con hdparm: rendimiento de los discos duros

Sorpresa, tras arrancar con mi flamante nuevo soporte para el chipset VIA 82CXXX y pedir información sobre mis discos duros, me encuentro:
# hdparm /dev/hda

/dev/hda:
multcount = 0 (off)
IO_support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 19929/255/63, sectors = 320170943, start = 0

# hdparm -i /dev/hda

/dev/hda:

Model=Maxtor 6Y160L0, FwRev=YAR41BW0, SerialNo=Y46VZA5E
Config={ Fixed }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=57
BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=off
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=268435455
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 udma3 udma4 udma5 *udma6
AdvancedPM=yes: disabled (255) WriteCache=enabled
Drive conforms to: (null):

* signifies the current active mode



# hdparm /dev/hdb

/dev/hdb:
multcount = 0 (off)
IO_support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 16383/255/63, sectors = 234439535, start = 0

# hdparm -i /dev/hdb

/dev/hdb:

Model=ST3120022A, FwRev=3.06, SerialNo=3JT3PHGK
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=off
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=234439535
IORDY=on/off, tPIO={min:240,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 udma3 udma4 *udma5
AdvancedPM=no WriteCache=enabled
Drive conforms to: ATA/ATAPI-6 T13 1410D revision 2:

* signifies the current active mode
Parece que se activa por defecto el IO_support, es decir, el acceso 32 bits. Creo, de todas maneras, que un valor más alto podría mejorar el rendimiento, luego lo tengo que mirar. Además. también está activado unmaskirq, que permite el enmascaramiento de interrupciones mientras se está accediendo al disco (debido a otra interrupción).

Por último, en ambos discos duros se encuentra activado el DMA y seleccionado el modo más rápido (udma6 en /dev/hda y udma5 en /dev/hdb).

Bien, hagamos unas pruebas de rendimiento:
# hdparm -t -T /dev/hda

/dev/hda:
Timing cached reads: 1248 MB in 2.00 seconds = 622.85 MB/sec
Timing buffered disk reads: 172 MB in 3.03 seconds = 56.83 MB/sec

# hdparm -t -T /dev/hdb

/dev/hdb:
Timing cached reads: 1240 MB in 2.00 seconds = 618.55 MB/sec
Timing buffered disk reads: 158 MB in 3.02 seconds = 52.33 MB/sec
Lástima no tener las pruebas de cuando no tenía mi flamante controlador instalado correctamente. Probemos, de todas maneras, desactivando el DMA:
# hdparm -t -T /dev/hda

/dev/hda:
Timing cached reads: 1248 MB in 2.00 seconds = 623.78 MB/sec
Timing buffered disk reads: 16 MB in 3.09 seconds = 5.18 MB/sec


# hdparm -t -T /dev/hdb

/dev/hdb:
Timing cached reads: 1208 MB in 2.01 seconds = 602.28 MB/sec
Timing buffered disk reads: 16 MB in 3.13 seconds = 5.12 MB/sec
¡Anda, la hostia! Pues si que hay diferencia. Sospecho que anteriormente tenía valores desde luego más altos, pero no tanto como cincuenta y pico megas de transferencia por segundo. En cualquier caso, veremos en los días siguientes si hay diferencia.

Quedan otras opciones que podría tocar. Por un lado el modo IO. Consultando el artículo "Hdparm" de RTFM-Wiki se comenta que los modos son los siguientes:
0 : default 16-bit
1 : 32-bit
2 : 16-bit
3 : 32-bit w/sync
El modo 3 podría ser, por tanto, algo más rápido.

Por otro lado, queda multisect, que indica cuantos sectores son leidos del disco en una sola interrupción. Así, cuanto mayor sea más mejora podría obtenerse.

Sin embargo, activando ambas opciones en ambos discos, obtengo:
# hdparm -t -T /dev/hda

/dev/hda:
Timing cached reads: 1236 MB in 2.00 seconds = 617.79 MB/sec
Timing buffered disk reads: 170 MB in 3.00 seconds = 56.60 MB/sec


# hdparm -t -T /dev/hdb

/dev/hdb:
Timing cached reads: 1248 MB in 2.00 seconds = 622.85 MB/sec
Timing buffered disk reads: 154 MB in 3.03 seconds = 50.77 MB/sec
Curioso, obtengo velocidades más lentas. Quizá por eso el sistema arrancó con esas opciones desactivadas, por que sabía que no eran buenas.

En fin, es bueno saberlo, quizá más adelante descubra por qué no me benefician esas opciones, por el momento se quedan desactivadas.