2 votes

Ajustement de la mémoire virtuelle Linux pour contourner le problème d'E/S de disque

Je rencontre un problème avec un serveur Linux qui écrit trop souvent sur le disque, ce qui entraîne un temps de réponse lent en raison d'une forte attente en E/S. J'ai déjà vérifié les valeurs SMART des disques et tout est en ordre. Il s'agit d'une configuration à deux disques en RAID1 avec le système de fichiers ext4.

Puisque je ne peux pas mettre à niveau le matériel pour le moment ni me débarrasser des applications à forte intensité en termes d'E/S, je prévois de configurer les paramètres de la machine virtuelle Linux pour essayer de réduire le temps d'attente en E/S.

Je pense à ajuster le swapping, mais surtout le dirty_background_ratio et le dirty_ratio.

Question :

Comment puis-je estimer l'ajustement de ces valeurs en fonction de la charge système actuelle et de l'utilisation de la mémoire?

3voto

Hrvoje Špoljar Points 5116

Vous voulez quelques choses. Tout d'abord, vous voulez réduire la swappiness

sysctl -w vm.swappiness=10

Cela permettra d'économiser quelques E/S disque ; parce que la dernière chose dont vous avez besoin, ce sont des écritures supplémentaires sur le disque lorsque le noyau tente de paginer certaines choses de la mémoire. L'objectif est de régler les choses de sorte que le moins de swapping possible soit nécessaire. Cependant, ne désactivez pas la swappiness en la réglant à 0 ou en la désactivant. Je recommanderais une action extrême d'aller jusqu'à régler la swappiness à 1. Si vous observez la sortie de dstat pendant un certain temps, vous remarquerez rapidement combien de données sont réellement écrites et lues depuis le swap.

Maintenant, il existe un mécanisme dans les noyaux plus récents (3.2+) appelé writeback throttling. Pour pouvoir l'utiliser comme vous l'avez dit, vous devez régler les ratios sales. Consultez plus de détails sur ce lien. La citation qui vous intéresse est la suivante

Une fois la limite de dirty_ratio (respectivement dirty_bytes) atteinte, le processus qui 
écrit est ralenti.

Par défaut, les paramètres de dirty sont plutôt élevés, surtout si vous avez beaucoup de mémoire et un sous-système de disque lent. Vous devez donc les régler à la baisse ; aussi bas que possible sans affecter une utilisation normale* et pourtant la valeur dictera le volume de données qui existera en mémoire avant que le noyau ne lance des processus pour écrire ces données sur le disque, lorsque votre situation de goulot d'étranglement E/S disque commence à se produire. À ce moment-là, vous voulez que ce processus soit ralenti, ce que le noyau fait en injectant des attentes dedans.

*Pour comprendre ce qui est une utilisation normale ; je recommanderais d'installer atop et d'observer ce qui s'y passe; vous souhaitez vérifier les chiffres de dirty là-bas et voir l'aperçu D où les lectures/écritures disque sont suivies. Il y a une colonne WCANCL; ce sont en fait des écritures qui ont été traitées en mémoire et qui n'ont jamais été nécessaires à écrire sur le disque (pages sales) mais pour des données temporaires. Mysql en a lorsque ça effectue des requêtes complexes, le compilateur lorsqu'il crée une multitude de petits fichiers obj qui ne seront pas nécessaires longtemps, etc...

En dehors de cela, il peut être utile de passer au planificateur de disque deadline et d'ajuster l'affinité des lectures par rapport aux écritures pour mieux correspondre à votre environnement. Par exemple, si vous faites 10 fois plus de lectures que d'écritures, vous voudrez peut-être régler

/sys/block//queue/iosched/writes_starved

à 5 plutôt que 2 par défaut. Augmenter

/sys/block//queue/iosched/write_expire

vous aidera également. De plus, vous pouvez gagner en latence si vous diminuez le nombre de requêtes effectuées en lot de 128 à disons 32

/sys/block//queue/nr_requests

0 votes

Intéressant. J'ai testé avec des valeurs dirty_background et dirty_ratio plus élevées et pendant un certain temps j'ai vu ce qui ressemblait à une légère amélioration des performances. Mon système est principalement en écriture, je ne pense pas que les lectures posent problème. En ce qui concerne /sys/block//queue, puisque j'utilise un logiciel RAID, devrais-je appliquer le paramètre via les périphériques md ou pointer vers le matériel réel ? Est-il possible que ext4 + SoftwareRAID posent problème ? Je vois [jdb2/mdx] et [mdx_raid1] dans la sortie iotop affichant 70 à 90% d'E/S.

1 votes

Vous avez vu de petites améliorations parce qu'avec des seuils de saleté plus élevés, tout était géré en RAM, mais si la taille des opérations dépasse les seuils de saleté; et ce n'était pas une écriture temporaire, il faudra finalement l'écrire sur le disque. À ce stade, le noyau commence à décharger la saleté sur le disque et votre disque devient un goulot d'étranglement. Pour l'éviter, vous devez régler le ratio de saleté à la baisse pour tirer parti du throttling du noyau dont j'ai parlé. Sans cela, vous perdez toute la latence. En ce qui concerne les changements apportés à la file d'attente de blocs, l'application des réglages à md devrait être correcte. Considérez également la suppression de la barrière si vous utilisez ext4 (option de montage nobarrier)

2voto

ewwhite Points 193555

Si vous avez de fortes écritures, vous serez limité par l'absence d'une couche de mise en cache d'écriture disponible pour votre système. Deux disques et une configuration RAID logicielle rendent cela difficile. Habituellement, c'est une caractéristique du RAID matériel. Ce que vous avez actuellement n'est pas la bonne configuration matérielle pour votre charge de travail.

Pour fournir de meilleures réponses, nous aurions besoin de détails sur ce que fait votre application, le système d'exploitation, si les barrières d'écriture sont activées sur votre système de fichiers, etc.

Édition : Vous ne pouvez optimiser autant si votre fondation est mauvaise. Peut-être devriez-vous envisager des SSD à la place de disques durs conventionnels à cette fin.

0 votes

Pour le moment, je ne peux pas mettre à niveau le matériel. Il s'agit d'une boîte Linux moderne, et les E/S sont produites par des tâches intensives mysqld, mongodb et jenkins.

0 votes

Mais si vous avez une charge d'écriture élevée, vous devriez utiliser une forme de mise en cache d'écriture et/ou plus de disques (plateaux) ou SSD... n'est-ce pas?

0 votes

Oui, je voulais juste améliorer les performances jusqu'à la mise à niveau du matériel :)

0voto

Dfinley Points 11

J'ai récemment écrit sur dirty_background_ratio et dirty_ratio, etc dans mon blog :

http://models.street-artists.org/2016/10/09/nfs-syncasync-some-of-the-issue-solved-or-how-to-set-vm-dirty_bytes-and-vm-dirty_background_bytes/

En résumé, il est recommandé de ne pas utiliser les variables *_ratio, mais plutôt les versions *_bytes, et d'estimer le nombre d'octets en prenant en compte la bande passante (ou le débit de génération des données) et en multipliant par une latence maximale que vous êtes prêt à accepter avant que les gros écrits commencent à être effectués sur le disque.

En fixant la valeur de dirty_background_bytes relativement basse (moins d'une seconde de délai à un débit de réception/génération de données maximal), vous vous assurez que le tampon ne se remplit pas inutilement. En fixant la valeur de dirty_bytes à un facteur de 2 ou 3 plus élevé (au moins, peut-être jusqu'à 10 fois ou plus, en fonction de la quantité de RAM que vous avez), vous vous assurez qu'un processus bursty ne soit pas bridé. Vous pouvez estimer la valeur de dirty_bytes en tenant compte de la différence entre le débit de génération des données et la vitesse d'écriture sur le disque. Il s'agit d'un taux de remplissage de tampon, que vous pouvez ensuite multiplier par un temps de tampon maximal avant que le remplissage soit bridé. Par exemple, si vous générez des données à un débit Rg et écrivez sur le disque à un débit Rd, et que Rg est supérieur à Rd, vous pouvez fixer dirty_background_bytes à Rg*(0,5 seconde) de sorte que votre disque commence à écrire environ 0,5 seconde après avoir commencé à saturer les tampons, et ensuite fixer dirty_bytes à max(2*Rg*0,5, (Rg-Rd)*(2 secondes)) par exemple. Les processus bursty pourront écrire jusqu'à 2 secondes avant que les tampons soient suffisamment pleins pour les brider.

0 votes

En français : En réalité, définissez dirty_bytes à quelque chose comme Rg*0,5 + (Rg-Rd)*2, donc en d'autres termes, cela permettra au tampon de se remplir jusqu'au point où l'arrière-plan entre en jeu, puis encore 2 secondes après cela jusqu'à ce qu'il limite votre processus d'écriture.

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