Table des matières
Jouer avec le scheduler d'I/O disque
Je ne vais pas détailler ici ce qu'est un scheduler (ou en francais ordonnanceur :p) : Wikipedia est la pour ça.
Par défaut depuis quelques années le scheduler utilisé était cfq.
Ses réglages par défaut ne sont pas forcément géniaux mais comme nous n'avons pas envie de trop nous embêter a les changer nous allons simplement changer de scheduler pour un autre.
Les scheduler classiques sont optimisés pour des disques a plateaux, si vous utilisez des disques non mécaniques mais à base de mémoire comme des SSD, carte Compact Flash, SD … vous voudrez utiliser le scheduler “noop” qui comme son nom l'indique ne cherche pas à optimiser pour s'adapter à une mécanique de disque.
Savoir quel scheduler est actuellement utilisé
Cela se passe en regardant le contenu des fichiers /sys/block/sd*/queue/scheduler (ou /sys/block/hd*/queue/scheduler pour les disques IDE). En utilisant la commande “cat /sys/block/sd*/queue/scheduler” vous aurez la liste des scheduler supportés par votre noyau et celui actuellement utilisé apparaitra entre crochets, comme dans l'exemple ci dessous où on peut noter l'utilisation de cfq :
$ cat /sys/block/sd*/queue/scheduler noop deadline [cfq] noop deadline [cfq] noop deadline [cfq] noop deadline [cfq]
On peut changer ce scheduler :
- soit a chaud pour chaque disque voulu
- soit changer le scheduler par défaut en passant l'option de boot elevator au noyau
Changer le scheduler utilisé disque par disque
Il suffit d'ecrire dans /sys/block/sd*/queue/scheduler celui que vous souhaitez utiliser : Si l'on souhaite changer sur les disques /dev/sda à /dev/sdd pour utiliser deadline :
# for i in a b c d; do echo deadline > /sys/block/sd$i/queue/scheduler ; done
On peut ensuite vérifier l'utilisation grâce a notre “cat /sys/block/sd*/queue/scheduler” :
$ cat /sys/block/sd*/queue/scheduler noop [deadline] cfq noop [deadline] cfq noop [deadline] cfq noop [deadline] cfq
Changer le scheduler par défaut pour votre système entier
Il faut alors passer le paramètre elevator à votre noyau.
Il faut donc passer le nom du scheduler choisi au noyau. Dans notre exemple ci dessus nous avons donc le choix entre :
- elevator=noop
- elevator=deadline
- elevator=cfq
Si vous utilisez grub2 sur une distribution debian/ubuntu, vous devez éditer le fichier /etc/default/grub (en root):
- chercher la ligne GRUB_CMDLINE_LINUX_DEFAULT
- y ajouter notre elevator=deadline choisi pour obtenir quelque chose qui devrait ressembler à :
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=deadline"
- appliquer ce changement en regénérant la configuration de grub (en root encore) :
# update-grub
On peut vérifier la présence de cette nouvelle option dans la configuration générée de grub en utlisant par exemple la commande “$ grep elevator /boot/grub/grub.cfg”
Il ne reste ensuite plus qu'a redémarrer pour voir que ce changement va être permanent.