Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

6.4. Configuration

L'une des premières décisions à prendre est quel ordonnanceur d'E/S vous souhaitez utiliser. Cette section fournit un aperçu de chacun des principaux ordonnanceurs afin de vous aider à décider lequel sera le meilleur pour votre charge de travail.

6.4.1. CFQ (« Completely Fair Queuing »)

CFQ tente de fournir une certaine équité dans les décisions de programmation des E/S en se basant sur le processus qui a initié les E/S. Trois différentes classes de programmation sont fournies : RT (« Real-time », ou temps réel), BE (« Best-effort », ou meilleur effort) et « idle » (inactivité). Une classe de programmation peut être assignée manuellement à un processus avec la commande ionice, ou assignée de manière programmée via l'appel système ioprio_set. Par défaut, les processus sont placés dans la classe de programmation BE. Les classes de programmation RT et BE sont ensuite sous-divisées en huit priorités d'E/S dans chaque classe, la priorité 0 est la plus élevée et la priorité 7 est la plus basse. Les processus dans la classe RT sont programmés de manière bien plus agressive que les processus dans BE ou dans « idle », ainsi toute E/S RT programmée est effectuée avant les E/S BE ou « idle ». Cela signifie que les E/S de priorité RT peuvent dépasser les E/S BE et « idle ». La programmation BE est la classe de programmation par défaut et 4 est la priorité par défaut dans cette classe. Les processus dans la classe de programmation « idle » sont uniquement traités lorsqu'il ne reste aucune autre E/S en attente dans le système. Ainsi, il est très important de définir la classe de programmation des E/S d'un processus sur « idle » uniquement si les E/S du processus ne sont pas du tout requises pour progresser.
CFQ fournit une certaine équité en assignant une tranche de temps à chaque processus effectuant des E/S. Pendant sa tranche de temps, un processus peut avoir (par défaut) jusqu'à 8 requêtes en cours au même moment. L'ordonnanceur tente d'anticiper si une application va délivrer davantage d'E/S dans un futur proche, en se basant sur les données historiques. S'il est prévu qu'un processus délivrera davantage d'E/S, alors CFQ sera inactif, en attente de ces E/S, même si des E/S provenant d'autres processus sont en attente d'être délivrées.
À cause de la mise en veille effectuée par CFQ, cela est souvent inapproprié pour le matériel ne souffrant pas d'une grosse pénalité lors des opérations de recherche, tel que des matrices de stockage externes ou des disques SSD. Si l'utilisation de CFQ sur un tel stockage est une condition préalable (par exemple, sur vous souhaitez aussi utiliser l'ordonnanceur d'E/S de poids proportionnel de cgroup), vous devrez ajuster certains paramètres pour améliorer les performances de CFQ. Définissez les paramètres suivants dans les fichiers de même nom situés dans /sys/block/périphérique/queue/iosched/ :
slice_idle = 0
quantum = 64
group_idle = 1
Lorsque group_idle est défini sur 1, il peut tout de même se produire des ralentissements d'E/S (ainsi le stockage principal n'est pas occupé à cause de la mise en veille). Cependant, ces ralentissements seront moins fréquents que les mises en veille sur chaque file d'attente dans le système.
CFQ est un ordonnanceur d'E/S ne conservant pas ses tâches, c'est-à-dire qu'il peut être inactif même lorsque des requêtes sont en attente (comme nous l'avons discuté ci-dessus). L'empilage des ordonnanceurs ne conservant pas leurs tâches peut présenter des latences de grande taille dans le chemin des E/S. Utiliser CFQ sur le dessus d'un contrôleur RAID matériel basé sur hôte est un exemple d'un tel empilage. Le contrôleur RAID peut implémenter son propre ordonnanceur ne conservant pas ses tâches, provoquant ainsi des délais sur deux niveaux dans la pile. Les ordonnanceurs de ne conservant pas leurs tâches opèrent au mieux lorsqu'ils possèdent un maximum de données sur lesquelles baser leurs décisions. Dans le cas où de tels algorithmes de programmation sont empilés, l'ordonnanceur le plus bas ne verra que ce que l'ordonnanceur du dessus ne lui a envoyé. Ainsi, la couche la plus basse verra un schéma d'E/S qui n'est pas du tout représentatif de la charge de travail réelle.

Réglages

back_seek_max
Les recherches en arrière sont habituellement mauvaise pour la performance car elles provoquent de plus grands délais dans le repositionnement des têtes que les recherches en avant. Cependant, CFQ les effectuera quand même si elles sont assez petites. Ce réglage contrôle la distance maximale en Ko que l'ordonnanceur autorise en recherche arrière. La valeur par défaut est 16 Ko.
back_seek_penalty
À cause de l'inefficacité des recherches en arrières, une pénalité est associée à chacune d'entre elles. La pénalité est un multiplicateur ; par exemple, prenez en considération une position de tête de disque sur 1024 Ko. Supposez qu'il y a deux requêtes dans la file d'attente, une sur 1008 Ko et une autre sur 1040 Ko. Les deux requêtes sont équidistantes par rapport à la position actuelle de la tête. Cependant, après avoir appliqué la pénalité de la recherche en arrière (par défaut : 2), la requête sur la position suivante du disque est maintenant deux fois plus proche que la requête précédente. Ainsi, la tête pourra avancer.
fifo_expire_async
Ce réglage contrôle combien de temps une requête async (écriture en mémoire tampon) peut rester sans être effectuée. Une fois le délai d'expiration (en millisecondes) dépassé, une seule requête async manquant de temps sera déplacée sur la liste d'expédition. La valeur par défaut est de 250 ms.
fifo_expire_sync
Ce réglage est le même que fifo_expire_async, mais pour les requêtes synchronisées (lectures et écritures O_DIRECT). La valeur par défaut est de 125 ms.
group_idle
Lorsqu'il est défini, CFQ deviendra inactif sur le dernier processus délivrant une E/S dans un cgroup. Il devrait être défini sur 1 lorsque des cgroups d'E/S de poids proportionnels sont utilisés et que slice_idle est défini sur 0 (ce qui est habituellement le cas sur les stockages rapides).
group_isolation
Si l'isolation de groupes est activée (définie sur 1), elle fournit une meilleure isolation entre les groupes, au détriment du débit. Généralement, si l'isolation de groupes est désactivée, une certaine équité est offerte aux charges de travail séquentielles uniquement. L'activation de l'isolation de groupes offre une équité pour les charges de travail séquentielles et aléatoires. La valeur par défaut est 0 (désactivé). Veuillez consulter Documentation/cgroups/blkio-controller.txt pour obtenir davantage d'informations.
low_latency
Lorsque « low latency » (latence basse) est activé (défini sur 1), CFQ tente de fournir un temps d'attente maximal de 300 ms pour chaque processus délivrant des E/S sur un périphérique. Ceci facilite l'établissement d'une certaine équité avec le débit. La désactivation de « low latency » (en paramétrant sur 0) ignore la latence cible, permettant à chaque processus dans le système d'obtenir une tranche complète. « Low latency » est activé par défaut.
quantum
Quantum contrôle le nombre d'E/S que CFQ enverra au stockage à la fois, principalement limitant la profondeur de la file d'attente du périphérique. Par défaut, ceci est défini sur 8. Le stockage peut supporter des files d'attente bien plus profondes, mais l'augmentation de quantum aura aussi un impact négatif sur la latence, particulièrement en présence de charges de travail d'écriture séquentielles de grande taille.
slice_async
Ce réglage contrôle la tranche de temps allouée à chaque processus délivrant des E/S asynchrones (écritures en mémoire-tampon). Il est défini par défaut sur 40 ms.
slice_idle
Ceci spécifie combien de temps CFQ restera en veille en attente de requêtes supplémentaires. La valeur par défaut sur Red Hat Enterprise Linux 6.1 et ses versions précédentes est 8 ms. Sur Red Hat Enterprise Linux 6.2 et ses versions supérieures, la valeur par défaut est 0. La valeur zéro améliore la débit d'un stockage RAID externe en supprimant tout ce qui est en veille aux niveaux de la file d'attente et de l'arborescence des services. Cependant, une valeur de zéro peut dégrader le débit sur un stockage non-RAID interne, car elle augmente le nombre général de recherches. Pour un stockage non-RAID, nous recommandons une valeur slice_idle plus élevée que 0.
slice_sync
Ce réglage dicte la tranche de temps allouée à un processus délivrant des E/S synchrones (lecture ou écriture directe). La valeur par défaut est de 100 ms.