Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
DebSousDeb - Débuter sous Debian
Newsletter
20 mai 2006

Optimiser vos périphériques IDE : hdparm

Pour cela nous allons utiliser l'utilitaire hdparm. Il nous faut donc l'installer :)
#apt-get install hdparm

hdparm permet de configurer certaines options de votre disque dur. Ces possiblités sont multiples et je vous conseille fortement de lire le man pour de plus amples informations. Néanmoins, nous allons en aborder quelques unes.
Nous supposons que notre disque dur est /dev/hda dans nos exemples. Dans un premier temps, nous voulons obtenir des informations sur notre disque

- Lecture des informations du disque :

#hdparm -i /dev/hda

/dev/hda:

Model=ST360020A, FwRev=3.34, SerialNo=5EX010L0
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=117231408
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
AdvancedPM=yes: unknown setting WriteCache=enabled
Drive conforms to: Unspecified:  ATA/ATAPI-1 ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6

* signifies the current active mode


Nous pouvons également utiliser l'option -I :

#hdparm -I /dev/hda

/dev/hda:

ATA device, with non-removable media
      Model Number:       ST360020A                            
        Serial Number:    5EX010L0            
        Firmware Revision:  3.34   
Standards:
        Supported: 6 5 4
        Likely used: 6
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      63
        --
        CHS current addressable sectors:   16514064
        LBA    user addressable sectors:  117231408
        device size with M = 1024*1024:       57241 MBytes
        device size with M = 1000*1000:       60022 MBytes (60 GB)
Capabilities:
        LBA, IORDY(can be disabled)
        Standby timer values: spec'd by Standard
        R/W multiple sector transfer: Max = 16  Current = ?
        Advanced power management level: unknown setting (0x0040)
        Recommended acoustic management value: 128, current value: 128
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=240ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    DOWNLOAD_MICROCODE
           *    Advanced Power Management feature set
                SET_MAX security extension
           *    Automatic Acoustic Management feature set
           *    Device Configuration Overlay feature set
           *    SMART error logging
           *    SMART self-test
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
        not     supported: enhanced erase
HW reset results:
        CBLID- above Vih
        Device num = 0 determined by the jumper
Checksum: correct


Ces informations correspondent à celles qui ont été lues au moment du dernier reboot de votre système. Nous avons ainsi le modèle du disque (Model), numéro de série et le FirmWare. Nous avons également le nombre de cylindre, de têtes et de secteur par cylindre, le nombre maximxum de secteur pouvant être lus par interruption et sa valeur actuelle ("R/W multiple sector transfer: Max = 16  Current = ?") la taille du tampon (buffsize) et le mode DMA supporté (DMA mode).

- Nous allons maintenant regarder la configuration actuelle de notre disque :

#hdparm /dev/hda

/dev/hda:
multcount    =  0 (off)
IO_support   =  0 (default 16-bit)
unmaskirq    =  0 (off)
using_dma    =  0 (off)
keepsettings =  0 (off)
readonly     =  0 (off)
readahead    =  8 (on)
geometry     = 7297/255/63, sectors = 117231408, start = 0

Comme nous pouvons le voir, le disque n'est quasiment pas configuré et donc optimisé (nous l'avons fait volontairement pour notre exemple).

- Nous allons maintenant tester les performances de notre disque avant son optimisation :

#hdparm -tT /dev/hda


/dev/hda:
Timing cached reads:   692 MB in  2.00 seconds = 346.00 MB/sec
Timing buffered disk reads:    8 MB in  3.73 seconds =   2.14 MB/sec

L'argument -t permet de tester la lecture directe sur les plateaux du disque.
L'argument -T teste la lecture des données depuis le cache.
Il est évident que la lecture à partir du cache est incomparablement plus rapide.
Ces données sont une lecture instantanée, vous pouvez donc la lancer 3 fois par exemple pour en faire une moyenne même si les résultats risquent d'avoir peu de variation. Voici une petite boucle qui vous lancera la commande toutes les 5 secondes. Vous pourrez l'interrompre en appuyant sur les touches Ctrl + C.

#while true; do hdparm -tT /dev/hda; sleep 5; done

- Augmentation du nombre de secteurs lus par interruption

A chaque fois que des données sont lues ou écrites sur un disque, un processus appelé interruption a lieu. A ce moment précis, un certain nombre de secteur sont envoyés. La valeur maximale est indiquée par la variable MaxMultSect (obtenue avec la commande hdparm -i /dev/hda) qui diffère suivant les disques durs. Dans notre exemple, cette fonctionnalité n'est pas active (multcount    =  0 (off)). Nous allons donc remédier à cela :
#hdparm -m16 /dev/hda

/dev/hda:
setting multcount to 16
multcount    = 16 (on)

On peut vérifier la prise en compte en relançant la commande hdparm /dev/hda et constater que le paramètre multicount est initialisé (multcount    = 16 (on)). Le disque pourra dorénavant envoyer 16 secteurs simultanément. On peut avoir un gain de 2 à 50 % sur la vitesse de transfert. Voyons ce que cela donne pour notre disque : 
#hdparm -tT /dev/hda

/dev/hda:
Timing cached reads:   672 MB in  2.00 seconds = 336.00 MB/sec
Timing buffered disk reads:    8 MB in  3.29 seconds =   2.43 MB/sec


Ici le gain n'est pas très énorme mais certains disques peuvent gérer jusqu'à 32 envois simultanés ce qui améliorerait les performances de façon un peu plus significative.

- Augmentation de la bande passante

Notre disque fonctionne actuellement en 16 bits. Il nous faut donc modifier cela car comme tous les disques récents il accepte le transfert en 32 bits qui définit la bande passante. Vous pouvez acitver cette option par le paramètre -c1 (-c0 activant le support 16 bits) ou -c3 qui ajoute la notion de synchronisation nécessaire à certains chipsets.

#hdparm -m16 -c1 /dev/hda

/dev/hda:
setting 32-bit IO_support flag to 1
setting multcount to 16
multcount    = 16 (on)
IO_support   =  1 (32-bit)


ou

#hdparm -m16 -c3 /dev/hda

/dev/hda:
setting 32-bit IO_support flag to 3
setting multcount to 16
multcount    = 16 (on)
IO_support   =  3 (32-bit w/sync)


Vous pouvez refaire un test de performance pour voir quelle est la meilleure option.

- Activer le DMA

L'activation du DMA permet d'envoyer directement les données à la mémoire vive. Il existe pusieurs modes possibles pour le DMA, l'option -d1 X32 active le mode DMA avec un débit compris entre 13 ou 16 Mb/s. L'option -d1 X66 active  le mode Ultra-DMA-2 avec un débit à 66 Mb/s. L'option -u1 permet au driver de disque de commencer à réponder à d'autres interruptions I/O alors que des données sont en écriture ou en lecture sur le disque via DMA.  A vous de faire des tests de performance, pour voir quel est le mode le plus approprié à votre disque.

#/dev/hdparm -d1 -X66 -u1 /dev/hda

/dev/hda:
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
setting xfermode to 66 (UltraDMA mode2)
unmaskirq    =  1 (on)
using_dma    =  1 (on)

Si nous testons maintenant nos performances, nous obtenons cela :

#hdparm -tT /dev/hda

/dev/hda:
Timing cached reads:   660 MB in  2.00 seconds = 330.00 MB/sec
Timing buffered disk reads:   56 MB in  3.11 seconds =  18.01 MB/sec

Voici maintenant notre configuration actuelle :

#hdparm /dev/hda

/dev/hda:
multcount    = 16 (on)
IO_support   =  3 (32-bit w/sync)
unmaskirq    =  1 (on)
using_dma    =  1 (on)
keepsettings =  0 (off)
readonly     =  0 (off)
readahead    =  8 (on)
geometry     = 7297/255/63, sectors = 117231408, start = 0


Voilà c'est terminé. cet article s'est notamment inspiré du livre de Jérôme Henry "Outils d'administration Linux en entreprise" aux éditions Vuibert.

Publicité
Commentaires
DebSousDeb - Débuter sous Debian
Publicité
Publicité