30 votes

Linux - réglage de contrôleurs RAID matériels réels (scsi et cciss)

La plupart des systèmes Linux que je gère sont dotés de contrôleurs RAID matériels (la plupart du temps HP Smart Array ). Ils fonctionnent tous sous RHEL ou CentOS.

Je suis à la recherche de paramètres concrets pour optimiser les performances des configurations qui intègrent des contrôleurs RAID matériels avec des disques SAS (Smart Array, Perc, LSI, etc.) et un cache sauvegardé par batterie ou flash. Supposons un RAID 1+0 et des broches multiples (4+ disques).

Je passe un temps considérable à régler les paramètres du réseau Linux pour les applications de trading financier et à faible latence. Mais beaucoup de ces options sont bien documentées (changement des tampons d'envoi/réception, modification des paramètres de la fenêtre TCP, etc.) Que font les ingénieurs du côté du stockage ?

Historiquement, j'ai apporté des modifications à l'article Ascenseur d'ordonnancement des E/S , qui a récemment opté pour la deadline y noop pour améliorer les performances de mes applications. Au fil des versions de RHEL, j'ai également remarqué que les valeurs par défaut compilées pour les périphériques de bloc SCSI et CCISS ont également changé. Cela a eu un impact sur les paramètres recommandés pour le sous-système de stockage au fil du temps. Cependant, cela fait longtemps que je n'ai pas vu de recommandations claires. Et je sais que les paramètres par défaut du système d'exploitation ne sont pas optimaux. Par exemple, il semble que le tampon de lecture par défaut de 128 kb soit extrêmement petit pour un déploiement sur du matériel de classe serveur.

Les articles suivants examinent l'impact sur les performances d'un changement de lecture anticipée cache et nr_requêtes sur les files d'attente de blocs.

http://zackreed.me/articles/54-hp-smart-array-p410-controller-tuning
http://www.overclock.net/t/515068/tuning-a-hp-smart-array-p400-with-linux-why-tuning-really-matters
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html

Par exemple, voici les modifications suggérées pour un contrôleur RAID HP Smart Array :

echo "noop" > /sys/block/cciss\!c0d0/queue/scheduler 
blockdev --setra 65536 /dev/cciss/c0d0
echo 512 > /sys/block/cciss\!c0d0/queue/nr_requests
echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb

Quels sont les autres éléments qui peuvent être réglés de manière fiable pour améliorer les performances du stockage ?
Je cherche en particulier des options sysctl et sysfs dans des scénarios de production.

39voto

samgabbay Points 654

J'ai constaté que lorsque j'ai dû faire des réglages pour réduire la latence par rapport au débit, j'ai diminué nr_requests par rapport à sa valeur par défaut (jusqu'à 32). L'idée étant que des lots plus petits égalent une latence plus faible.

De même, pour read_ahead_kb, j'ai constaté que pour les lectures/écritures séquentielles, l'augmentation de cette valeur offre un meilleur débit, mais j'ai constaté que cette option dépend vraiment de votre charge de travail et de votre modèle d'IO. Par exemple, sur un système de base de données que j'ai récemment optimisé, j'ai modifié cette valeur pour qu'elle corresponde à une taille de page de base de données unique, ce qui a permis de réduire la latence de lecture. Augmenter ou diminuer cette valeur au-delà s'est avéré néfaste pour les performances dans mon cas.

En ce qui concerne les autres options ou paramètres des files d'attente des dispositifs de blocage :

max_sectors_kb \= J'ai fixé cette valeur pour qu'elle corresponde à ce que le matériel autorise pour un seul transfert (vérifiez la valeur du fichier max_hw_sectors_kb (RO) dans sysfs pour voir ce qui est autorisé).

nomerges \= ceci vous permet de désactiver ou d'ajuster la logique de consultation pour la fusion des demandes io. (Désactiver cette option peut vous faire économiser quelques cycles cpu, mais je n'ai pas vu d'avantage à modifier cette option pour mes systèmes, donc je l'ai laissée par défaut).

rq_affinité \= Je n'ai pas encore essayé, mais voici l'explication tirée de la documentation du noyau

Si cette option est "1", la couche de blocs migre les requêtes vers la couche de blocs. groupe" de processeurs qui a soumis la requête à l'origine. Pour certaines charges de travail, cette option permet une réduction significative des cycles de l'unité centrale en raison des effets de cache.
Pour les configurations de stockage qui doivent maximiser la distribution de l'achèvement la définition de cette option sur '2' force l'exécution de l'achèvement sur le serveur l'unité centrale requérante (en contournant la logique d'agrégation du "groupe")"

planificateur \= vous avez dit que vous aviez essayé la date limite et que rien ne s'était passé. J'ai testé à la fois noop et deadline, mais j'ai trouvé que deadline l'emportait pour les tests que j'ai effectués récemment pour un serveur de base de données.

NOOP a donné de bons résultats, mais pour notre serveur de base de données, j'ai pu obtenir de meilleures performances en ajustant le planificateur de délais.

Options pour l'ordonnanceur de délai situé sous /sys/block/{sd,cciss,dm-}*/queue/iosched/ :

fifo_batch \= un peu comme nr_requests, mais spécifique à l'ordonnanceur. La règle d'or est de diminuer cette valeur pour réduire la latence ou de l'augmenter pour augmenter le débit. Contrôle la taille des lots de requêtes de lecture et d'écriture.

write_expire \= définit le délai d'expiration des lots d'écriture, la valeur par défaut étant de 5000 ms. Une fois de plus, diminuer cette valeur réduit la latence d'écriture, tandis que l'augmenter augmente le débit.

read_expire \= définit le délai d'expiration pour les lots de lecture ; la valeur par défaut est de 500 ms. Les mêmes règles s'appliquent ici.

front_merges \= J'ai tendance à désactiver cette fonction, qui est activée par défaut. Je ne vois pas l'intérêt pour l'ordonnanceur de gaspiller des cycles de calcul en essayant de fusionner les demandes d'entrées-sorties.

écrit_affamé \= puisque deadline est orienté vers la lecture, le défaut est de traiter 2 lots de lecture avant de traiter un lot d'écriture. J'ai trouvé que la valeur par défaut de 2 convenait à ma charge de travail.

4voto

Janne Pikkarainen Points 31244

Plus que tout, tout dépend de votre charge de travail.

read_ahead_kb peut vous aider s'il est vraiment utile de lire à l'avance un grand nombre de données d'un fichier, comme lors de la diffusion de vidéos. Parfois, cela peut vous nuire gravement. Oui, la valeur par défaut de 128 Ko peut sembler petite, mais avec suffisamment de concurrence, elle commence à sembler grande ! D'un autre côté, avec un serveur tel qu'un serveur d'encodage vidéo qui ne fait que convertir les vidéos d'un format à un autre, cela peut être une très bonne idée.

nr_requests Lorsqu'il est surréglé, il peut facilement inonder votre contrôleur RAID, ce qui nuit à nouveau aux performances.

Dans le monde réel, vous devez surveiller les latences . Si vous êtes connecté à un réseau SAN, jetez un coup d'œil avec iostat , sar ou autre, et voyez si les délais de traitement des demandes d'entrée/sortie sont très courts. Bien sûr, cela s'applique également aux disques locaux : si les latences sont très importantes, envisagez d'ajuster vos paramètres d'ascenseur d'E/S en réduisant max_requests et d'autres paramètres.

4voto

Mark Points 21

POUR INFORMATION read_ahead_kb y blockdev --setra sont juste différentes façons d'effectuer le même réglage en utilisant des unités différentes (kB vs secteurs) :

foo:~# blockdev --setra 65536 /dev/cciss/c0d0
foo:~# blockdev --getra /dev/cciss/c0d0
65536
foo:~# cat /sys/block/cciss\!c0d0/queue/read_ahead_kb
32768
foo:~# echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb
foo:~# cat /sys/block/cciss\!c0d0/queue/read_ahead_kb
2048
foo:~# blockdev --getra /dev/cciss/c0d0
4096

Ainsi, le

blockdev --setra 65536 /dev/cciss/c0d0

dans votre exemple n'a aucun effet.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X