{{tag>io entree_sortie scheduler performance tuning cfq noop deadline}}
====== 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) : [[https://fr.wikipedia.org/wiki/Ordonnancement_d%27E/S|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
Si vous utilisez ceci ce changement ne sera pas pris en compte si vous redémarrez votre machine : il faudra soit le refaire, soit inclure la commande de changement dans un script lancé au démarrage
===== Changer le scheduler par défaut pour votre système entier =====
Il faut alors passer le paramètre **elevator** à votre noyau.
Il faut vous assurer que le scheduler que vous souhaitez utiliser est disponible pour votre noyau, sinon changer les options de compilation de celui-ci pour le supporter, ou en choisir un supporté ;)
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.
====== Référence =====
* http://www.gelato.unsw.edu.au/IA64wiki/IOScheduling/Comparisons/IOzone
* http://www.admon.org/system-tuning/how-to-change-default-io-scheduler/
* http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/
* http://stackoverflow.com/questions/1009577/selecting-a-linux-i-o-scheduler
* http://linuxpoison.blogspot.fr/2009/10/setting-io-scheduler-for-maximum.html
* http://www.ilsistemista.net/index.php/linux-a-unix/38-linux-i-o-schedulers-benchmarked-anticipatory-vs-cfq-vs-deadline-vs-noop.html?start=8