La nuit dernière, pendant une insomnie je suis tombé sur cet article intéressant. L’auteur, contributeur du noyau Linux, prend la défense de la mémoire swap qui est pourtant si décriée, d’après lui.
Cela me semblait curieux. Selon ma conception de l’espace swap, il s’agissait d’une RAM de secours à utiliser en cas de saturation imminente. Partant de là, je pensais de façon raisonnable que l’espace swap était donc en option pourvu que l’on ait bien assez de RAM pour ses besoins. Je me demandais d’ailleurs bien pourquoi certains de mes serveurs utilisaient de l’espace swap malgré toute la RAM disponible.
Ma conception était erronée. L’espace swap n’a pas ce rôle de roue de secours dans un système Linux. Du moins pas directement.
Il s’agit, comme son nom l’indique, d’un espace d’échange qui permet au noyau de mieux prioriser les ressources mémoire et ainsi maximiser les opportunités d’optimisation. Cela devant, en principe, améliorer la réactivité globale du système.
Au fur et à mesure que de la RAM est concédée, tantôt pour du cache de fichiers, tantôt pour de l’allocation applicative (via malloc
ou mmap
), le noyau Linux essaie de ranger les pages peu demandées dans l’espace swap. Cela laisse ainsi place aux pages qui sont les plus utiles sur le moment ou les pages d’un futur proche. Par exemple, il sera préférable que la RAM laisse place au cache de fichiers en cours d’utilisation plutôt qu’à la vieille heap d’un programme qui ne l’utilise plus (ou qu’il a oublié de libérer…).
Quand la mémoire commence à s’encombrer sans espace swap de disponible, il est possible de détruire les pages de cache fichier (sous certaines conditions) pour libérer de la RAM. Cela n’entraîne aucune perte de données. En revanche, nous comprendrons sans mal pourquoi la même stratégie ne pourrait s’appliquer aux pages mémoire des programmes en cours d’exécution. Ces pages-là devront ainsi perdurer en RAM, quand même elles ne serviraient pas à grand chose. Cela représente un potentiel manque à gagner : le noyau aurait pu faire meilleur usage de cette mémoire, en y cachant des fichiers en cours d’utilisation intensive, par exemple.
Sachant tout cela, je peux aisément percevoir comment le manque de swap peut s’avérer délétère pour le serveur qui tourne 7j/7 et 24h/24 sur le long terme. Je reste néanmoins plus nuancé en ce qui concerne les ordinateurs personnels ou stations de travail qu’on rallume tous les matins.
De mon expérience personnelle sur ma machine de bureau (32 GB de RAM + 4 GB de swap, vm.swappiness = 60
), les nouvelles pages n’ont pas le temps de s’accumuler assez pendant les quelques heures d’utilisation. L’espace swap n’est donc presque jamais utilisé, sauf pour certaines occasions de lancer une VM : le noyau décide alors de mettre quelques gigas-octets entiers de cache fichiers, sûrement le disque virtuel de la VM.
Sur l’un de mes serveurs, en revanche, l’espace swap est bien utilisé constamment malgré l’abondance de RAM. L’espace swap est en ce moment utilisé à hauteur de 3 GB sur 12 GB, et ce conjointement avec les 40 GB d’utilisés sur 64 GB au total (en comptant le cache). Linux laisse ainsi ~20 GB de libre immédiatement pour accueillir des pages jugées plus importantes que celles qui, manifestement, ne méritent que de croupir en swap pour le moment.
En résumé : j’avais tort de considérer l’espace swap comme une bête extension de secours de la mémoire physique.