Optimisation des disques sous linux

par Kenji


1/ Installation de l'utilitaire hdparm

Le but de la manœuvre est d'optimiser la vitesse des transferts disques, qui sont le point noir de la machine d'un point de vue vitesse. Mais aussi optimiser l'utilisation du processeur relatif aux accès disques. Il faut tout d'abord installer le logiciel hdparm.

A partir des sources : allez par ici pour télécharger le tarball de cet utilitaire, suivi des traditionnels './configure', 'make' et 'make install'. Sous debian ou clône, un simple 'apt-get install hdparm' suffira, pour les distribution à base de rpm, un petit tour sur rpmfind.net ou bien dans votre gestionnaire de paquetages.

2/ Présentation

Il faut tout d'abord commencer par recueillir des informations sur votre périphérique. Les paramètres -i ou -I suivi du périphérique en question vous le permettent. Petit rappel sur les périphériques IDE, sous linux /dev/hda correspond au maître du premier port IDE, hdb à l'esclave, hdc au maître du second port... Nous préférerons l'option -i, qui donne un résumé des options les plus intéressante :


# hdparm -i /dev/hda
/dev/hda:
 Model=IC35L080AVVA07-0, FwRev=VA4OA52A, SerialNo=*************
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=52
 BuffType=DualPortCache, BuffSize=1863kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=160836480
 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=yes: disabled (255) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-5 T13 1321D revision 1: 
 * signifies the current active mode

Voilà ce que cela donne avec mon disque dur IBM 80Go. La première partie du résultat de la commande donne des précision sur le matériel lui-même, nous nous intéresserons plus aux modes supportés par le périphérique. Notez que vous pouvez aussi optimiser des lecteurs ou bien graveurs de cd-rom, ou de dvd-rom (comme par exemple limiter la vitesse de ceux-ci, et donc le bruit occasionné).

PIO modes: PIO signifie Programmed Input/Output, il s'agit d'un ancien mode de transfert de données, les données était transférées par le processeur, et donc celui-ci est très utilisé lors des transferts. Cette méthode a été remplacé par le DMA. Voilà à quoi correspondent chaque modes (le -X** étant le paramètre de hdparm correspondant) :


PIO Mode 0 	3.3 Mo/sec	-X08
PIO Mode 1 	5.2 Mo/sec	-X09
PIO Mode 2 	8.3 Mo/sec	-X10
PIO Mode 3 	11.1 Mo/sec	-X11
PIO Mode 4 	16.6 Mo/sec	-X12

DMA modes et UDMA modes:
DMA signifie, dans la langue de Shakespeare, Direct Access Memory, pour Accès Mémoire Direct (c'était dur ;), cette méthode d'accès qui permet de réduire l'utilisation du processeur lors des accès aux disques, et ainsi ne pas bloquer le système pendant les transferts. Le DMA permet au processeur de communiquer seulement les demandes de données, puis passer à autre chose, une interruption sera générée lors de la fin du transfert. Il y a deux types de DMA, le DMA busmaster (c'est le périphérique lui-même qui fait le DMA) et le DMA normal, où c'est le chipset qui remplit ce rôle. Voici les performances de ces modes :


Singleword
DMA Mode 0	2.1 Mo/sec	-X16
DMA Mode 1	4.2 Mo/sec	-X17
DMA Mode 2	8.3 Mo/sec	-X18
Multiword
DMA Mode 0	4.2 Mo/sec	-X32
DMA Mode 1	13.3 Mo/sec	-X33
DMA Mode 2	16.6 Mo/sec	-X34

Le DMA Singleword transfert les données mot par mot (word), un mot est en fait deux octets. Le DMA multiword en transfert plusieurs. L'Ultra DMA permet l'augmentation des vitesses de transfert grâce au transfert sur les fronts montant et descendant, alors que le DMA le faisait seulement sur les fronts montant. 

Ultra DMA Mode 0 16.7 Mo/sec -X64 Ultra DMA Mode 1 25.0 Mo/sec -X65 Ultra DMA Mode 2 33.3 Mo/sec -X66 Ultra DMA Mode 3 44.4 Mo/sec -X67 Ultra DMA Mode 4 66.7 Mo/sec -X68 Ultra DMA Mode 5 100.0 Mo/sec -X69 Ultra DMA Mode 6 133.0 Mo/sec -X70 

Les modes devrait être comme cela : 

Ultra DMA Mode 0 16.7 Mo/sec -X64 
Ultra DMA Mode 1 25.0 Mo/sec -X65 
Ultra DMA Mode 2 33.3 Mo/sec -X66 
Ultra DMA Mode 3 44.4 Mo/sec -X67 
Ultra DMA Mode 4 66.7 Mo/sec -X68 
Ultra DMA Mode 5 100.0 Mo/sec -X69 
Ultra DMA Mode 6 133.0 Mo/sec -X70

Chacun de ces modes correspondent en fait à une norme, mon disque est conforme à la norme "ATA/ATAPI-5 T13 1321D revision 1", ce qui permet d'aller jusqu'au DMA mode 5 ou inférieur car les normes sont ascendantes et donc compatibles entre elles, un peu comme pour l'usb 1 et 2.

3/ Optimisation

Pour optimiser vos disques, la première chose à faire et de faire un test des performances actuelles, pour cela les option -T et -t de hdparm sont là. La première correspond à un test des timings de lecture du cache, le deuxième à un test de lecture sur le disque. Ces test doivent être exécutés deux à trois fois de suite pour être efficient. La commande 'hdparm -tT /dev/hda' permet donc de tester les performances du maître du premier port IDE. Pour visualiser ou vérifier la configuration actuelle de ce disque faites 'hdparm /dev/hda'.


# hdparm -tT /dev/hda
/dev/hda:
 Timing cached reads:   3336 MB in  2.00 seconds = 1668.25 MB/sec
 Timing buffered disk reads:   90 MB in  3.05 seconds =  29.52 MB/sec

Ensuite à vous de régler les paramètres qui vont bien en fonction de vos périphériques, et de l'utilisation du processeur ( un top permettra de la voir). Au final vous aurez une configuration du style :


# hdparm -X68 -d1 -u1 -m16 -c3 -W1 /dev/hda /dev/hdb

Ici l'option -W1 permet de "enable the IDE drive's write-caching feature", c'est ce que nous dit la page du manuel de hdparm. Cette page est complète, elle regroupe l'ensemble des paramètre et les explique, donc si vous avez un problème n'hésitez pas à la consulter.

4/ Automatisation

La commande que vous avez ainsi affiné doit être exécutée à chaque démarrage de votre station pour que celle-ci soit prise en compte. Un simple script bien placé permettra de le faire. Créez un fichier /etc/init.d/hdparm.sh avec un éditeur non graphique (car ceux-ci rajoute parfois des éléments de mise en page en autre, et le script n'apprécie pas). Voilà à quoi devrait ressembler votre fichier :


#!/bin/sh
echo -n "Optimiation des périphérique avec hdparm."
/sbin/hdparm -q -d1 -X68 /dev/hda
/sbin/hdparm -q -E4 /dev/hdc

L'option -q pour -quiet permet à hdparm de ne pas être trop verbeux, utile pour éviter de faire grossir les fichiers de log. Le -E4 permet de dire que le lecteur de cdrom sera un lecteur 4X, il ne fera que moins de bruit.
Rendons ce script exécutable avec un petit 'chmod 755 /etc/init.d/hdparm.sh', puis pour qu'il soit exécuté à chaque démarrage: 'update-rc.d hdparm.sh start 60 S'.

5/ Configuration du noyau

Pour pouvoir utiliser les modes DMA correctement, le noyau doit être configuré. Les noyaux de bases doivent l'être pour la plupart. Si vous le compiler vous-même, dans le menu "IDE, ATA and ATAPI Block devices" il vous faudra selectionné :


	Generic PCI IDE chipset support
	Generic PCI bus-master DMA support
	Use PCI DMA by default when available