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

sysadmin/tips/io_scheduler.txt · Dernière modification: 2015/01/16 09:59 par james
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0