Swappiness : gestion de la RAM sous Linux

De HomeServer.DIY.
Aller à : Navigation, rechercher

Le noyau Linux est réputé être très efficace dans la gestion de la mémoire vive (la fameuse RAM) comparé à d'autres concurrents comme un certain OS venant d'un certain Microsoft. Malgré tout, et même si beaucoup de mémoire vive est disponible, l'espace d'échange (le swap sous Linux, le fichier d'échange sous Windows) est toujours nécessaire, et parfois utilisé, même à tort. C'est ce "à tort" qu'il est possible de modifier sous Linux, grâce au swappiness.


Rappel rapide sur la gestion de la RAM

Basiquement, la mémoire vive contient différentes sortes de données et d'informations :

  • Le noyau
  • Les données créées au démarrage concernant le matériel (et certaines créées après, à chaud, comme pour le branchement d'une clé USB)
  • Les applications et leurs bibliothèques
  • Leurs données
  • Le cache


Et le cache, justement, est un énorme fourre-tout pour le noyau dans lequel il garde notamment une copie des derniers fichiers ouverts par les programmes ou lui-même. C'est très pratique pour gagner du temps si vous avez à rouvrir un fichier, car ça économise une lecture sur le disque dur. Et l'écriture peut ainsi être reportée lorsque la charge est plus faible, très pratique pour ne pas ralentir les applications.

Par défaut, le noyau se réserve la totalité de la RAM libre pour le cache, et ajuste au fur et à mesure en fonctions des programmes et données chargées. Mais si jamais la consommation réelle de RAM devient conséquente, il est possible pour le noyau soit de "détruire" les infos les plus anciennes du cache, soit de déplacer ces infos sur le swap si elles sont encore nécessaires. Le swap, cette extension de mémoire allouée sur une petite portion d'un disque dur, est bien évidemment beaucoup plus lent. On cherchera donc à éviter le plus possible cette écriture.


Le swapiness, kézako ?

Le swapiness est un paramètre du noyau Linux permettant de définir avec quelle sensibilité il va écrire dans le swap si la quantité de RAM à utiliser devient trop importante. Seulement dans certains cas, comme la virtualisation (par exemple, avec OpenVZ), le noyau, en réservant trop tôt la mémoire réellement utilisée par un conteneur, va pousser inutilement des données sur le swap sans se poser plus de questions. Du moins c'est le comportement par défaut de la plupart des noyaux livrés avec les distributions les plus courantes.

Il est donc possible de réduire la sensibilité à un niveau plus acceptable, notamment si l'on a beaucoup de RAM à disposition. Et Linux oblige, on peut même modifier le comportement en temps réel. C'est pas beau tout ça ? Donc, l'incantation magique, à saisir dans un shell avec les droits root, est la suivante :

# echo 10 > /proc/sys/vm/swappiness

Voilà, la modification du comportement est déjà prise en compte. La valeur possible est à ajuster en 0 et 100, 60. 0 désactivera toute mise en swap du cache, et ne l'utilisera que pour y transférer des données d'application en cours (pour éviter la saturation réelle de la RAM). 100 dira au noyau d'utiliser le swap pour un oui ou pour un non, ce qui n'est pas toujours intelligent, sachant que le swap est généralement assez petit. Mais au moins on a le choix. La plupart du temps il est réglé sur 60 (valeur par défaut choisie par les développeurs du noyau), ce qui est un peu élevé, compte tenu de la quantité de RAM disponible même sur les plus petites machines de nos jours.

Si vous voulez éviter d'avoir à retaper la commande à chaque redémarrage de la machine, il va falloir modifier le fichier /etc/sysctl.conf (qui regroupe tous les paramètres noyaux à appliquer au démarrage), toujours avec les droits administrateur, avec votre éditeur de texte favori (vi, nano, emacs pour les plus masochistes). Si la ligne suivante est déjà présente, tant mieux, sinon, ajoutez-là à la fin du fichier :

vm.swappiness = 10

Une fois sauvegardé, le noyau se règlera de lui-même à chaque redémarrage (notamment quand vous mettez celui-ci à jour).

Malgré tout, si des données se trouvent déjà en swap, et qu'on veut le vider pour remettre les compteurs à zéro, il est nécessaire de saisir les deux commandes suivantes :

# swapoff -a

# swapon -a


Conclusion

Les cas d'utilisations massives de RAM sont peu courants pour un serveur perso, mais ils existent quand même : virtualisation (toutes technologies confondues), serveurs de jeu (Minecraft en tête, qui est un formidable bouffeur de ressources toutes catégories), pour ne citer qu'eux. Le premier réflexe est de munir votre machine de plus de RAM. C'est un bon réflexe ! Mais derrière, une bonne gestion de cette RAM est toujours nécessaire. Vous savez maintenant comment dire au noyau d'agir un peu mieux en fonction de votre utilisation. Utiliser un environnement 64bit est aussi optimal.