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.