Performances de Linux : Pourquoi vous devriez presque toujours ajouter de l’espace swap

Nous savons que l’utilisation de l’espace swap Linux à la place de la RAM (mémoire) peut sérieusement ralentir les performances. Donc, on pourrait se demander, puisque j’ai plus que suffisamment de mémoire disponible, ne serait-il pas mieux de supprimer l’espace swap ? Il y a des avantages en termes de performances lorsque l’espace d’échange est activé, même si vous avez plus de mémoire que nécessaire. Mise à jour, voir également la partie 2 : Performances de Linux : Ajouter presque toujours de l’espace swap (ZRAM).

Même avec une mémoire de serveur installée plus que suffisante, vous constaterez souvent que l’espace swap sera utilisé après de longues périodes de fonctionnement. Voir l’exemple ci-dessous d’un serveur de chat en direct avec environ un mois de temps de fonctionnement:

 total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G

La sortie de free -h ici montre 308M d’espace de swap utilisé. Lorsque j’ai lancé des vérifications pour le swap, il n’y avait aucun signe d’activité d’E/S de swap en cours ou intempestif. De plus, le service kswap n’a pas consommé beaucoup de temps CPU. En fait, le processus kswap était introuvable dans top (les processus les plus importants classés par temps CPU). Pour confirmer, j’ai utilisé la commande suivante :

ps -A | grep kswap 40 ? 00:00:29 kswapd0

…donc dans ce cas, comme dans beaucoup, l’utilisation de la swap ne nuit pas aux performances du serveur Linux. Maintenant, regardons comment l’espace swap peut réellement aider les performances des serveurs Linux.

Mise à jour : Récemment, j’ai installé Manjoro i3 sur mon Pinebook Pro. Il est maintenant livré avec la ZRAM activée par défaut.

Avantages de l’espace swap sur les systèmes disposant de suffisamment de RAM

serveur de 512 Go maximum - 2 Go de swap utilisés

serveur de 512 Go maximum - 2 Go de swap utilisés

Il est normal et peut être une bonne chose pour les systèmes Linux d’utiliser un peu de swap, même s’il reste de la RAM disponible. Le noyau Linux déplacera les pages de mémoire qui ne sont presque jamais utilisées dans l’espace swap afin de s’assurer qu’encore plus d’espace cachable est rendu disponible en mémoire pour les pages de mémoire plus fréquemment utilisées (une page est un morceau de mémoire). L’utilisation du swap devient un problème de performance lorsque le noyau est pressé de déplacer continuellement les pages de mémoire dans et hors de la mémoire et de l’espace swap.

Un autre avantage est que le swap donne aux admins le temps de réagir aux problèmes de faible mémoire. Nous remarquerons souvent que le serveur agit lentement et, à la connexion, nous remarquerons un swapping important. Sans swap (comme décrit dans la section suivante), manquer de mémoire peut créer des réactions en chaîne beaucoup plus soudaines et graves. En général, je conseille donc de définir l’espace d’échange à la taille de votre plus gros processus. Par exemple, la mémoire configurée de MySQL dans my.cnf. Il peut même être plus petit, en particulier si vous avez la surveillance et / ou l’alerte en place.

Certains recommandent aucun swap ou une taille de swap légèrement supérieure à la RAM totale. Si vous pouvez trouver des raisons valables pour cela, alors c’est peut-être votre choix. Cependant, ce n’est guère le cas sur les serveurs, et vous devriez plutôt équilibrer votre décision avec les effets que le swap aura sur vos applications spécifiques. Le swap ne modifie pas la quantité de RAM requise pour un serveur sain, ou un ordinateur de bureau d’ailleurs. Il est conçu pour être complémentaire aux performances des systèmes sains.

Pour résumer :
– Même s’il y a encore de la RAM disponible, le noyau Linux déplacera les pages de mémoire qui ne sont presque jamais utilisées dans l’espace d’échange.
– Il est préférable d’échanger les pages de mémoire qui sont inactives depuis un certain temps, en gardant les données souvent utilisées dans le cache, et cela devrait se produire lorsque le serveur est le plus inactif, ce qui est l’objectif du noyau.
– Évitez de définir votre espace d’échange trop grand si cela a pour conséquence de prolonger les problèmes de performance, les pannes ou votre temps de réponse (sans surveillance/alertes appropriées).

Espace d’échange vs. pas d’espace d’échange lorsque la mémoire disponible est faible

Contrairement au cas ci-dessus, si vous n’avez pas assez de mémoire, l’espace d’échange sera utilisé assez souvent et sensiblement plus lors de tout pic de besoins en mémoire. Si vous n’avez pas assez de mémoire et pas d’espace swap, cela entraînera souvent l’échec de l’allocation de mémoire pour les demandes nécessitant plus de pages de mémoire. En dernier recours, le noyau déploiera le tueur OOM pour nuke les processus à haute mémoire (généralement MySQL, java, etc.).

Pour un regard plus détaillé sur l’espace d’échange de Linux, lisez les chapitres Swap Management et Page Frame Reclamation de Kernel.org docs. Consultez également la dernière section, « Pression de cache et swap du noyau », de mon autre billet de blog pour obtenir des conseils sur le réglage de l’utilisation de l’espace de swap Linux par le noyau. Si votre espace d’échange  » utilisé  » est toujours  » 0 « , alors vous avez effectivement une tonne de RAM librement disponible, auquel cas il peut être sûr de supprimer l’espace d’échange… ou vous pouvez ajuster la pression de cache de votre noyau pour utiliser encore plus de RAM.

Pour résumer :
– Les E/S d’échange s’échelonnent très mal. Si les pages de mémoire ne peuvent pas être swapées uniquement lorsque le serveur est inactif, vous devriez régler ou désactiver le swap. Ce n’est généralement pas le cas, d’où le titre « presque toujours » de ce billet de blog.
– Avec le swap désactivé, les problèmes de performance deviennent perceptibles très rapidement, et le tueur OOM peut vous avoir ! 🙂

Pour comparaison, voici la sortie de free utilisant une ancienne version de free de procps-ng-3.3.1 sur le même serveur:

 total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G

Pression du cache du noyau et swappiness

Maintenant que vous avez activé le swap. Envisagez d’ajuster la pression du cache de votre serveur et sa tendance au swap (vm.swappiness) en suivant le guide ci-dessous, qui provient de l’article précédent : Le serveur Linux a besoin d’une mise à niveau de la RAM ? Vérifiez avec top, free, vmstat et sar:

vfs_cache_pressure – Contrôle la tendance du noyau à récupérer la mémoire, qui est utilisée pour la mise en cache des objets de répertoire et d’inode. (par défaut = 100, valeur recommandée de 50 à 200)

swappiness – Ce contrôle permet de définir l’agressivité avec laquelle le noyau va échanger les pages de mémoire. Des valeurs plus élevées augmenteront l’agressivité ; des valeurs plus faibles diminueront la quantité de swap. (par défaut = 60, valeurs recommandées entre 1 et 60) Supprimez votre swap pour la valeur 0, mais ce n’est pas recommandé dans la plupart des cas.

Pour modifier, vous pouvez ajouter ou remplacer ces lignes dans le fichier /etc/sysctl.conf. Par exemple, si vous avez peu de mémoire jusqu’à votre mise à niveau, vous pouvez essayer quelque chose comme:

vm.swappiness=10vm.vfs_cache_pressure=200

Cela augmentera la pression du cache, ce qui peut sembler quelque peu contre-productif puisque le cache est bon pour les performances. Cependant, un swapping trop fréquent réduit beaucoup plus les performances globales de votre serveur. Ainsi, ne pas conserver autant de cache en mémoire permettra de réduire l’activité de swap. De plus, avec vm.swappiness défini à 10 ou aussi bas que 1, cela réduira le swapping de disque.

Sur un serveur sain avec beaucoup de mémoire disponible, utilisez ce qui suit :

vm.swappiness=10vm.vfs_cache_pressure=50

Cela diminuera la pression du cache. Comme la mise en cache est bonne pour les performances, nous voulons garder les données en cache en mémoire plus longtemps. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.

To check current values using these commands use:

sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure

To enable these settings temporarily without rebooting, use the following commands:

sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50