Meilleures pratiques pour ajuster le comportement de la mémoire swappiness et du cache sous Linux

Libérez les performances maximales de Linux en maîtrisant l'optimisation de la mémoire. Ce guide détaille les meilleures pratiques pour ajuster les paramètres critiques du noyau `vm.swappiness` et `vfs_cache_pressure`. Apprenez à minimiser la latence des applications causée par un échange disque inutile et à optimiser la mise en cache des métadonnées du système de fichiers pour des opérations d'E/S plus rapides sur vos serveurs.

30 vues

Meilleures pratiques pour le réglage de la propension à l'échange (Swappiness) et du comportement du cache mémoire sous Linux

Les systèmes Linux gèrent la mémoire de manière dynamique, utilisant la RAM disponible pour les applications, les caches du système de fichiers et les opérations du noyau. Bien que cette flexibilité soit un atout, des paramètres mémoire mal configurés peuvent entraîner des goulots d'étranglement de performance, en particulier un I/O disque excessif dû à un échange (swapping) inutile ou à une mise en cache inefficace.

Ce guide explore deux paramètres critiques du noyau qui régissent la manière dont Linux gère la pression mémoire : vm.swappiness et vfs_cache_pressure. Comprendre et ajuster ces réglages est essentiel pour les administrateurs système qui cherchent à maximiser la réactivité des applications, à minimiser la latence causée par l'accès au disque et à assurer une performance stable du serveur.


Comprendre les paramètres de gestion de la mémoire Linux

Linux utilise des heuristiques pour décider quelles pages mémoire récupérer lorsque le système a besoin de plus de RAM libre. Les deux domaines principaux contrôlés par les paramètres du noyau sont l'échange (swapping) (déplacement des pages mémoire inactives vers le disque) et la mise en cache (conservation des métadonnées et des données du système de fichiers dans la RAM).

1. vm.swappiness

vm.swappiness dicte la propension du noyau à déplacer les processus hors de la mémoire physique et vers l'espace d'échange (swap) sur le disque. C'est une valeur comprise entre 0 et 100.

  • Valeur Élevée (par exemple, 60, la valeur par défaut sur de nombreuses distributions) : Le noyau procède agressivement à l'échange des pages inactives, même si une grande quantité de mémoire libre est disponible. Cela donne la priorité au maintien d'un cache de pages volumineux, mais peut entraîner des échanges fréquents et générateurs de latence si les applications ont soudainement besoin de cette mémoire.
  • Valeur Faible (par exemple, 10 ou moins) : Le noyau préfère récupérer de la mémoire à partir du cache de pages avant de commencer à échanger les processus. Cela maintient les applications en cours d'exécution plus longtemps dans la RAM, améliorant la réactivité, mais réduisant potentiellement les performances d'I/O disque si le système doit constamment libérer des pages de cache.
  • Valeur de 0 : Sur les noyaux modernes (post-2.6.32), définir swappiness à 0 tente d'éviter l'échange entièrement jusqu'à ce que cela soit absolument nécessaire (c'est-à-dire, en cas de conditions de manque de mémoire), forçant le système à se fier d'abord à la récupération de mémoire à partir du cache de pages.

Application pratique de vm.swappiness

Le réglage optimal dépend fortement de la charge de travail :

Type de Charge de Travail Plage swappiness Recommandée Justification
Serveurs de bases de données, Calcul Haute Performance (CHP) 1 - 10 Maintenir les ensembles de travail actifs des bases de données résidents dans la mémoire physique pour éviter la latence du disque.
Serveurs à usage général, Postes de travail 30 - 60 (Par défaut) Équilibre la réactivité et les besoins de mise en cache disque.
Serveurs fortement dépendants de grands caches de fichiers (par exemple, serveurs web avec trafic disque élevé) 60 - 80 Donne la priorité au maintien d'un cache disque volumineux pour servir rapidement les requêtes ultérieures depuis la RAM.

Comment vérifier la valeur actuelle :

cat /proc/sys/vm/swappiness

Comment changer la valeur temporairement (jusqu'au redémarrage) :

Pour définir swappiness à 10 :

sudo sysctl vm.swappiness=10

Comment changer la valeur définitivement :

Modifiez le fichier /etc/sysctl.conf et ajoutez ou modifiez la ligne :

# /etc/sysctl.conf
vm.swappiness = 10

Après l'enregistrement, appliquez les changements sans redémarrer en utilisant :

sudo sysctl -p

Conseil de bonne pratique : Pour les serveurs modernes hébergeant des applications gourmandes en mémoire comme les bases de données, définir vm.swappiness entre 1 et 10 est généralement le meilleur point de départ pour prévenir la dégradation des performances due à l'échange.

2. vfs_cache_pressure

vfs_cache_pressure contrôle l'agressivité avec laquelle le noyau récupère la mémoire utilisée pour les métadonnées de répertoire et d'inode (le cache VFS).

  • Cette valeur est comprise entre 0 et 1000.
  • La valeur par défaut est généralement de 100.

À une valeur de 100, le noyau équilibre la récupération de la mémoire du cache VFS par rapport à la récupération de la mémoire utilisée par le cache de pages (données disque). Une valeur de 100 signifie qu'en cas de pression mémoire, le noyau tente de récupérer 1 partie de la mémoire du cache inode/dentry pour chaque 1 partie de la mémoire du cache de pages.

Ajustement de vfs_cache_pressure

  • Augmenter la Valeur (par exemple, > 100) : Rend le noyau plus agressif dans la récupération de la mémoire du cache VFS. Cela libère plus rapidement de la RAM, mais peut entraîner des recherches de système de fichiers ultérieures plus lentes, car les métadonnées devront être relues depuis le disque.
  • Diminuer la Valeur (par exemple, < 100) : Rend le noyau plus conservateur dans la récupération du cache VFS. Cela maintient les informations de répertoire et d'inode plus longtemps en mémoire, accélérant les opérations répétées du système de fichiers.

Quand diminuer vfs_cache_pressure :

Si votre système accède fréquemment aux mêmes structures de répertoires volumineuses (courant dans les applications complexes, l'orchestration de conteneurs ou des configurations réseau spécifiques), définir cette valeur plus bas (par exemple, 50) peut améliorer les performances en gardant les métadonnées facilement disponibles dans la RAM.

Quand augmenter vfs_cache_pressure :

Si votre système souffre d'une pression mémoire générale et que vous souhaitez que le noyau récupère toute mémoire inutilisée rapidement, vous pourriez augmenter cette valeur, bien que cela soit moins courant que de la diminuer.

Comment vérifier la valeur actuelle :

cat /proc/sys/vm/vfs_cache_pressure

Comment changer la valeur définitivement :

Modifiez /etc/sysctl.conf :

# /etc/sysctl.conf
vfs_cache_pressure = 50

Appliquez les changements avec sudo sysctl -p.

Avertissement : Définir vfs_cache_pressure à 0 désactive efficacement la récupération par le noyau de la mémoire du cache VFS, similaire à définir vm.swappiness=0 pour l'échange. Cela ne devrait être fait que sur des systèmes disposant d'une RAM abondante qui nécessitent la performance maximale absolue du système de fichiers.


Scénarios de réglage complets

Choisir la bonne combinaison de ces paramètres optimise le compromis entre la stabilité des applications et la mise en cache du système de fichiers.

Scénario 1 : Serveur de base de données (Priorité mémoire)

Objectif : Maximiser la résidence mémoire des applications ; minimiser l'échange à tout prix.

  • vm.swappiness = 5
  • vfs_cache_pressure = 50 (Garder les données de répertoire en cache dans une certaine mesure, mais donner la priorité à la mémoire de l'application sur les métadonnées VFS si la RAM devient limitée).

Scénario 2 : Serveur à I/O disque élevé (Priorité au cache)

Objectif : Maximiser les performances du disque en maintenant les données de fichiers fréquemment accédées dans le cache de pages.

  • vm.swappiness = 80 (Permet que l'échange se produise plus tôt pour libérer de la RAM en vue de l'expansion du cache disque).
  • vfs_cache_pressure = 100 (Équilibre standard entre l'inode et le cache de pages).

Scénario 3 : Hôte de virtualisation ou système à usage général

Objectif : Performance stable sur plusieurs charges de travail.

  • vm.swappiness = 30 (Un réglage modéré qui favorise le maintien des VM/processus actifs dans la RAM légèrement plus longtemps que la valeur par défaut de 60, tout en permettant un échange contrôlé).
  • vfs_cache_pressure = 100 (La valeur par défaut est souvent suffisante).

Surveillance et validation

Après l'application des changements, une surveillance continue est cruciale pour valider l'impact. Utilisez des outils comme free, vmstat et des tableaux de bord de surveillance des performances système.

Utilisation de vmstat :

Surveillez les colonnes si (swap in) et so (swap out). Un système sain avec un swappiness faible devrait afficher des valeurs faibles ou nulles pour si et so sous charge normale.

vmstat 5 10

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----\ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 123456 102400 5123456    0    0     0     5   40   70  1  1 98  0  0

Si les valeurs so restent élevées après la réduction de swappiness, cela indique que la RAM physique est véritablement insuffisante pour la charge de travail, et l'augmentation de la RAM est la seule solution permanente.

Conclusion

Le réglage de vm.swappiness et de vfs_cache_pressure sont des techniques fondamentales d'optimisation des performances sous Linux. En réduisant de manière conservatrice le swappiness (par exemple, à 10) pour les applications sensibles à la mémoire, vous garantissez que les processus cruciaux restent résidents dans la RAM physique. Simultanément, l'ajustement précis de vfs_cache_pressure permet aux administrateurs de dicter la préférence du noyau entre le stockage des métadonnées du système de fichiers et celui des données d'application en mémoire. Testez toujours les modifications dans des conditions de charge réalistes pour confirmer l'amélioration des performances souhaitée.