{{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