SSD Nodes Learn 🎉 VPS dès $5.50/mois
Guides Matt ConnorPar Matt Connor

Votre VPS a-t-il besoin de swap et quelle taille choisir ?

Les images cloud n’ont souvent aucun swap. Apprenez quand créer un fichier de swap, quelle taille choisir, ce que change vm.swappiness et quand préférer zram.

Votre VPS a-t-il besoin de swap ?

La plupart des images cloud sont livrées sans swap. Sur un petit VPS, la réponse est généralement oui : ajoutez un fichier de swap. Le swap ne transforme pas un serveur de 1 GB en serveur de 2 GB. Il fournit au kernel un emplacement où placer les pages anonymes peu utilisées. Le cache de pages reste ainsi disponible et l’OOM killer (out of memory killer, la routine du kernel qui sélectionne un processus et le tue pour libérer de la mémoire) n’intervient qu’en dernier recours.

En bref : sur une machine qui exécute quelques services à longue durée de vie, un petit fichier de swap justifie l’espace disque utilisé. Sur une machine où un processus essaie régulièrement d’allouer plus de mémoire que la machine n’en possède, le swap ne vous sauvera pas. Il rendra l’échec plus lent et plus difficile à diagnostiquer. La suite de ce guide explique comment distinguer ces deux situations et présente les deux coûts qui n’apparaissent que sur un VPS.

Toutes les commandes ci-dessous nécessitent root sur votre propre serveur. Exécutez-les donc sur ce serveur au lieu de copier la sortie obtenue sur la machine de quelqu’un d’autre.

Ce que fait réellement le swap, et ce qu’il ne fait pas

La mémoire Linux se présente sous deux formes. Les pages adossées à des fichiers sont des copies d’éléments qui existent déjà sur le disque : vos programmes et chaque fichier que vous avez lu récemment. Cet ensemble constitue le page cache. Les pages anonymes sont des zones mémoire qui ne correspondent à aucun fichier : le heap et la stack, ainsi que la majeure partie de ce qu’une base de données alloue à l’exécution.

Lorsque la mémoire vient à manquer, le kernel doit récupérer des pages. Une page propre adossée à un fichier est facile à récupérer, car la copie sur le disque existe toujours et la page pourra être relue plus tard. Ce n’est pas le cas d’une page anonyme, car sa seule copie se trouve en RAM. Sans swap, le kernel n’a que deux choix pour la mémoire anonyme : la conserver ou tuer le processus qui la possède.

Un serveur sans swap utilise tout de même la pagination. Il pagine simplement la mauvaise mémoire. Sous pression, le kernel réduit le page cache et évince des pages de fichiers dont il aura bientôt besoin, notamment le code exécutable des programmes en cours d’exécution. Ces pages reviennent sous forme de major page faults. Vous voyez des lectures disque dans la colonne bi de vmstat et le compteur pgmajfault augmenter dans /proc/vmstat, tandis que si et so restent à zéro pendant toute l’opération. La machine est en thrashing et les compteurs du swap ne signalent rien.

Le swap n’ajoute pas de capacité. Si le working set, c’est-à-dire les pages réellement utilisées, est plus grand que la RAM, le swap transforme un kill pour manque de mémoire en serveur très lent. Ce compromis peut être souhaitable, car il est possible de se connecter à un serveur lent et de le réparer, contrairement à une base de données tuée. Il peut aussi aggraver la situation, car un serveur lent continue d’échouer aux health checks tout en gardant toutes les connexions ouvertes. Décidez ce que vous préférez avant de l’ajouter.

Pourquoi les images cloud sont-elles livrées sans swap ?

C’est un choix délibéré. Une même image doit démarrer sur toutes les offres proposées par un fournisseur. Une partition swap fixe gaspillerait donc de l’espace disque sur les petites offres et serait inutile sur les grandes. La vitesse du swap dépend également du stockage sous-jacent de la machine virtuelle, que l’image ne peut pas connaître à l’avance. Les créateurs d’images privilégient aussi un comportement prévisible : dans un parc de machines, un processus qui s’arrête immédiatement est plus facile à diagnostiquer qu’une machine qui reste active tout en répondant à chaque requête avec plusieurs secondes de retard.

Ces raisons concernent les machines destinées à être remplacées. Un VPS que vous conservez est différent. Vous le réparez au lieu de le remplacer ; quelques secondes de pagination mémoire valent donc généralement mieux qu’un service arrêté. Considérez l’absence de swap comme un réglage par défaut conçu pour un autre cas d’usage.

Fichier d’échange ou partition d’échange sur un VPS ?

Utilisez un fichier. Une partition implique de redimensionner un système de fichiers root en fonctionnement sur un disque déjà partitionné. C’est un risque réel sans aucun avantage. Un fichier se crée et se supprime avec les commandes usuelles. Vous pouvez modifier sa taille ultérieurement sans toucher à la table de partitions.

La vitesse ne permet pas de les départager. Au bout de swapon, le kernel lit une fois la carte des extents du fichier, puis soumet directement les opérations d’E/S au périphérique bloc. Le système de fichiers n’intervient donc pas à chaque page écrite dans le swap ou lue depuis celui-ci. Sur le même disque, un fichier d’échange et une partition d’échange ont les mêmes performances.

Deux limites sont à connaître. Ne placez pas le swap sur un système de fichiers réseau comme NFS (network file system). Avec btrfs, le fichier doit avoir la copie à l’écriture désactivée et la compression désactivée. C’est pourquoi btrfs fournit son propre helper pour en créer un.

Ajouter un fichier swap sur Ubuntu ou Debian

Vérifiez d’abord l’existant avant de modifier quoi que ce soit.

swapon --show
free -h
findmnt -no FSTYPE /

Une sortie vide de swapon --show signifie qu’aucun swap n’est configuré, ce qui est normal sur une image cloud fraîchement créée. findmnt affiche le type du système de fichiers racine, qui détermine la méthode de création du fichier. Sur ext4, utilisé par la plupart des images cloud, fallocate est sûr.

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

chmod doit être exécutée avant mkswap. Si vous l’omettez, mkswap vous l’indique : mkswap: /swapfile: insecure permissions 0644, fix with: chmod 0600 /swapfile. Un fichier swap lisible par tous expose à chaque utilisateur de la machine la mémoire paginée par les autres processus. Un mkswap correct confirme ensuite la taille, avec une ligne telle que Setting up swapspace version 1, size = 2 GiB (2147479552 bytes).

Sur xfs ou btrfs, la dernière commande peut échouer avec swapon: /swapfile: swapon failed: Invalid argument. Avec XFS, cela se produit parce que fallocate laisse des extents non écrits. Écrivez donc directement les octets.

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

Avec btrfs, la cause est la copie sur écriture, et la version actuelle de btrfs-progs définit automatiquement les bons indicateurs.

sudo btrfs filesystem mkswapfile --size 2g /swapfile

Dans les deux cas, terminez avec chmod 600, mkswap lorsque cette commande s’applique, puis swapon, et vérifiez le résultat.

swapon --show
free -h

swapon --show doit afficher /swapfile avec le type file et la taille demandée, tandis que free -h doit afficher une ligne Swap avec presque aucune utilisation. Un swap inutilisé sur une installation fraîche est normal. Le noyau n’y déplace des pages que lorsqu’il en a besoin.

Faites en sorte que la configuration survive à un redémarrage, puis testez immédiatement l’entrée.

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --show

swapon -a lit /etc/fstab, donc une ligne incorrecte échoue immédiatement, sous vos yeux. Une faute de frappe que vous ne testez pas vous attendra lors d’un redémarrage imprévu, lorsque la machine redémarrera sans le swap que vous pensiez avoir configuré.

Pour supprimer le swap plus tard, exécutez sudo swapoff /swapfile, supprimez la ligne correspondante dans fstab, puis exécutez sudo rm /swapfile. swapoff doit d’abord relire en RAM chaque page paginée. Sur une machine très sollicitée, la commande peut donc échouer avec swapoff: /swapfile: swapoff failed: Cannot allocate memory. Libérez de la mémoire, puis réessayez.

Quelle doit être la taille du fichier swap ?

Le rôle du swap est de conserver les pages anonymes froides. La valeur importante est donc la quantité de mémoire allouée qui est réellement inactive, et non la quantité de RAM incluse dans l’offre. La mémoire inactive n’augmente pas proportionnellement à la taille de l’offre. Le multiplicateur diminue donc lorsque les offres deviennent plus grandes. C’est la règle utilisée dans ce guide.

ChartSwap file size this guide sets, by plan RAM
The data behind this chart
[
  {
    "label": "1 GB plan",
    "swap_gb": 2,
    "swap_x_ram": 2
  },
  {
    "label": "2 GB plan",
    "swap_gb": 2,
    "swap_x_ram": 1
  },
  {
    "label": "4 GB plan",
    "swap_gb": 2,
    "swap_x_ram": 0.5
  },
  {
    "label": "8 GB plan",
    "swap_gb": 4,
    "swap_x_ram": 0.5
  },
  {
    "label": "16 GB plan",
    "swap_gb": 4,
    "swap_x_ram": 0.25
  }
]

Avec l’offre la plus petite, le fichier swap doit faire 2 Go, soit 2 fois la RAM, car une machine de 1 Go dispose de si peu de marge qu’un seul pic peut déclencher l’OOM killer. En haut du tableau, le fichier est limité à 4 Go, soit 0.25 fois la RAM, car le paging d’une telle quantité de données sur un stockage partagé prend suffisamment longtemps pour que le serveur soit pratiquement indisponible pendant l’opération. Réduisez ces valeurs si l’espace disque autorisé est limité, car le fichier consomme réellement de l’espace disque.

La principale raison classique de dimensionner le swap à une taille au moins égale à celle de la RAM est l’hibernation, qui écrit l’intégralité de l’image mémoire dans le swap. Un VPS n’hiberne pas. Cette règle ne s’applique donc pas à votre cas.

Que change réellement vm.swappiness ?

vm.swappiness n’est pas un pourcentage de RAM ni un seuil. Il s’agit du coût relatif que le kernel attribue à la récupération des pages anonymes par rapport aux pages de fichiers. La valeur par défaut est 60. Réduisez-la et le kernel privilégie la suppression du page cache. Augmentez-la et le kernel privilégie la pagination de la mémoire anonyme vers le swap.

Ce choix présente un compromis dans les deux sens. Avec vm.swappiness = 10, une base de données conserve davantage de ses allocations en mémoire et le paie en relisant les fichiers qui viennent d’être supprimés du cache. Sur une machine dont le rôle principal est de servir des fichiers, c’est le mauvais choix, car le page cache fournit alors l’essentiel du travail utile.

Définir cette valeur sur 0 ne désactive pas le swap. Cela indique au kernel d’éviter de récupérer la mémoire anonyme jusqu’à ce qu’il soit presque à court de mémoire, ce qui déclenche plus tôt l’OOM killer au lieu de le retarder. Si vous ne voulez pas de swap, supprimez le fichier de swap.

sysctl vm.swappiness
printf 'vm.swappiness = 10\n' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
sysctl vm.swappiness

Une commande sysctl -w seule reste active jusqu’au prochain redémarrage, puis cesse silencieusement de s’appliquer. Écrivez donc la valeur dans le fichier situé sous /etc/sysctl.d/. Les kernels depuis la version 5.8 acceptent des valeurs comprises entre 0 et 200. Une valeur supérieure à 100 n’a de sens que lorsque le swap est presque aussi rapide que la RAM, ce qui correspond à zram.

zram : le swap consomme du CPU plutôt que du disque

zram est un périphérique bloc compressé qui réside en RAM. Utilisez-le comme swap : une page qui aurait été écrite sur le disque est compressée et reste en mémoire. Il n’y a ni E/S disque ni consommation de quota disque. En contrepartie, chaque pagination entrante et sortante consomme du temps CPU, et les pages compressées occupent de la RAM que vos applications ne peuvent plus utiliser.

Les taux de compression compris entre 2:1 et 3:1 sont généralement publiés pour les pages anonymes. Votre propre valeur est affichée par zramctl dans ses colonnes DATA et COMPR. Mesurez-la au lieu de vous baser sur la valeur habituelle, car certaines charges de travail contiennent des données qui se compressent à peine.

sudo apt install zram-tools

Définissez ALGO=zstd et PERCENT=25 dans /etc/default/zramswap, puis redémarrez le service et examinez le résultat.

sudo systemctl restart zramswap
zramctl
swapon --show

PERCENT correspond à une part de la RAM totale. Ainsi, la valeur 25 sur une machine dotée de 4 GB réserve jusqu’à 1 GB pour les pages compressées. Commencez avec une valeur faible et augmentez-la uniquement si zramctl indique que le périphérique se remplit. Le paramètre PRIORITY du même fichier détermine quel swap le noyau utilise en premier : la priorité la plus élevée est choisie. Un fichier swap ajouté avec swapon sans option de priorité reçoit une priorité négative. zram est donc utilisé en premier, puis le fichier prend le relais lorsque zram est plein. swapon --show affiche les deux valeurs dans sa colonne PRIO. Sur les distributions qui utilisent systemd-zram-generator au lieu de zram-tools, les mêmes paramètres se trouvent dans /etc/systemd/zram-generator.conf.

zram convient à une machine qui dispose de ressources CPU disponibles et de peu d’espace disque libre. C’est un mauvais choix lorsque la capacité CPU est déjà la ressource qui vous manque, car la compression entre alors en concurrence avec l’application pour utiliser les mêmes ressources.

Deux pièges du swap qui ne concernent que les VPS

Le premier piège concerne le disque. Un fichier swap de 2 GB consomme 2 GB du stockage inclus dans votre offre dès sa création, car l’espace doit être alloué à l’avance. La valeur de df -h / diminue immédiatement de la totalité de cette taille et ne remonte pas tant que vous n’avez pas supprimé le fichier. Avec une petite offre, cela représente une part importante de l’espace disponible, et un système de fichiers root plein provoque bien plus de problèmes que le swap n’en a résolu. Le fichier apparaît aussi dans la sortie de du. Gardez-le à l’esprit lorsque vous recherchez de l’espace et que df et du ne donnent pas la même origine de l’espace utilisé.

Le second piège concerne la latence. Les entrées-sorties du swap utilisent le stockage que l’hôte partage avec ses autres invités, et vous ne pouvez pas voir leur charge depuis votre invité. Vous n’en observez que l’effet : la lecture d’une page, normalement rapide, prend parfois beaucoup plus de temps, et le processus qui l’attend reste bloqué jusqu’à son arrivée. Le raisonnement est le même que pour le temps de steal CPU sur un hôte partagé, mais appliqué à la file d’attente du disque plutôt qu’à la run queue. Mesurez cette latence sur votre propre serveur, car tout chiffre publié décrit la situation des voisins d’une autre machine.

Comment savoir si le swap vous pénalise ?

L’utilisation du swap n’est pas un problème. C’est le trafic de swap qui l’est. Un serveur qui a plusieurs centaines de mégaoctets dans le swap, sans activité de pagination, a simplement déplacé une mémoire à laquelle rien n’a accédé depuis plusieurs heures. C’est précisément le résultat recherché.

Surveillez les débits plutôt que les totaux.

vmstat 1 5

si et so correspondent aux kibioctets par seconde transférés vers et depuis le swap. Sur un serveur sain, ces valeurs restent nulles ou proches de zéro, quelle que soit la valeur de la colonne swpd. Une valeur so durable, accompagnée d’une hausse simultanée de si, signifie que les pages sont écrites sur le swap puis relues immédiatement. C’est du thrashing.

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  3 1048572  38210   4096  61440  912 1180  2210  1290 1402 2890  9  7 12 72  0

Cet exemple montre un serveur en difficulté. Le signal le plus clair ne se trouve pas dans les colonnes du swap. Il s’agit de wa, à 72 : le CPU a donc passé la majeure partie de son temps à attendre des opérations d’I/O. b vaut 3, ce qui signifie que trois processus sont bloqués.

PSI (pressure stall information) répond plus directement à cette question.

cat /proc/pressure/memory
some avg10=8.42 avg60=5.11 avg300=2.03 total=1284729
full avg10=3.10 avg60=1.94 avg300=0.71 total=498210

some avg10=8.42 signifie qu’au cours des 10 dernières secondes, au moins une tâche a été bloquée en attente de mémoire pendant 8.42 % du temps. full comptabilise la durée pendant laquelle toutes les tâches non inactives étaient bloquées. Une valeur full durable indique donc un impact mesurable, et non un simple avertissement. Si le fichier n’existe pas, votre kernel a désactivé PSI par défaut. Vous devez ajouter psi=1 à la ligne de commande du kernel.

Pour voir quels processus conservent des pages dans le swap :

sudo awk '/^Name:/{n=$2} /^VmSwap:/ && $2+0 > 0 {printf "%10d kB  %s\n", $2, n}' /proc/[0-9]*/status | sort -rn | head

Pour vérifier si l’OOM killer est déjà intervenu :

sudo journalctl -k --grep "Out of memory"

Une intervention apparaît sous la forme Out of memory: Killed process 2199 (mysqld) total-vm:1275860kB, anon-rss:129252kB, file-rss:0kB, shmem-rss:0kB, UID:114 pgtables:504kB oom_score_adj:0. Le journal du service, à la même seconde, contient Main process exited, code=killed, status=9/KILL. Si vous avez vu ces lignes sur un serveur sans swap, ajouter un swap file est la première mesure à essayer, et la moins coûteuse.

Quand le swap n’est pas la bonne solution

Le swap laisse du temps lorsque la pression mémoire est temporaire ou concerne des pages froides. Il ne résout rien pour un processus qui continue de grossir jusqu’à s’arrêter, et il rend l’incident plus difficile à surveiller, car la machine passe ces minutes supplémentaires à paginer au lieu d’échouer rapidement et de redémarrer.

Limitez plutôt le processus. Un service systemd accepte MemoryMax= et MemorySwapMax= dans un fichier drop-in. C’est ce qui permet de limiter la mémoire et le CPU d’un service avec systemd sans modifier l’application. Les conteneurs disposent des mêmes contrôles à un niveau supérieur. Les définir permet d’empêcher un service Compose de saturer toute la machine. Dans les deux cas, le processus tué est identifiable dans un journal que vous pouvez retrouver, au lieu de laisser le kernel choisir la victime selon son score.

Faites-le lorsque le serveur est encore récent et peu sollicité. La création du fichier swap et la définition d’une limite mémoire prennent quelques minutes. Cette opération fait partie du travail à effectuer pendant les dix premières minutes sur un nouveau VPS.

FAQ

L’ajout de swap transforme-t-il mon VPS de 1 GB en VPS de 2 GB ?

Non. La swap est bien plus lente que la RAM, et le kernel n’y déplace que les pages qu’il considère comme peu utilisées. Elle fournit une marge lors des pics de charge et permet de stocker des pages mémoire allouées puis jamais réutilisées. Si votre charge lit et écrit activement plus de mémoire que la machine n’en possède, la swap transforme un arrêt pour manque de mémoire en pagination constante. Le serveur reste alors actif, mais répond trop lentement pour être utilisable. Dans ce cas, ajoutez de la RAM ou limitez le processus qui consomme de plus en plus de mémoire.

De quelle quantité de swap un VPS de 1 GB ou de 2 GB a-t-il besoin ?

2 GB suffisent dans les deux cas. Il n’est ensuite pas nécessaire d’augmenter cette valeur avec la quantité de RAM. La swap stocke les pages anonymes peu utilisées, et la quantité de mémoire réellement inactive sur un serveur n’augmente pas comme la quantité totale de RAM. L’ancienne règle qui recommande deux fois la quantité de RAM vient de l’hibernation, qui écrit l’image complète de la mémoire sur le disque. Un VPS n’est jamais mis en hibernation. Dépasser 4 GB fournit surtout un échec plus long et plus lent, sur un stockage que vous partagez avec d’autres invités.

Faut-il définir vm.swappiness à 0 pour empêcher la swap ?

Non, et ce réglage ne fait pas ce que son nom laisse penser. vm.swappiness = 0 ne désactive pas la swap. Il indique au kernel d’éviter de récupérer les pages anonymes jusqu’à ce que la mémoire soit presque épuisée. Un arrêt OOM devient alors plus probable, et non moins probable. Cette configuration reporte également toute la récupération sur le cache de pages, ce qui force plus souvent les lectures de fichiers à revenir sur le disque. Si vous voulez désactiver complètement la swap, exécutez sudo swapoff -a et supprimez la ligne correspondante dans fstab. Si vous voulez réduire la pagination, essayez vm.swappiness = 10, puis comparez les colonnes si et so dans vmstat avant et après la modification.

Dois-je utiliser zram plutôt qu’un fichier de swap ?

Utilisez zram si vous disposez de ressources CPU et de peu d’espace disque disponible. Utilisez un fichier de swap dans le cas inverse. zram compresse les pages et les conserve en RAM. Elle évite donc complètement les entrées-sorties disque, mais consomme du CPU lors de chaque pagination et utilise de la RAM que les applications ne peuvent plus exploiter. Sur un VPS avec une faible allocation CPU, ce coût pèse sur la ressource qui vous manque déjà. Il est courant d’utiliser les deux : donnez à zram une priorité supérieure avec PRIORITY dans /etc/default/zramswap et conservez un fichier de swap sur disque en dessous pour absorber le dépassement.

Pourquoi l’OOM killer s’est-il exécuté alors que free indiquait qu’il restait de la mémoire ?

free fournit une mesure ponctuelle, tandis qu’une allocation se produit instantanément. Un processus qui demande rapidement un bloc volumineux, plus vite que la récupération ne peut libérer de mémoire, peut être tué même si la situation moyenne semblait correcte. Consultez le journal du kernel avec sudo journalctl -k --grep "Out of memory". Il indique le processus tué et sa taille résidente au moment de l’arrêt. Vérifiez ensuite si l’arrêt vient d’une limite de cgroup plutôt que d’un manque de mémoire sur toute la machine. Un conteneur ou une unité systemd avec MemoryMax= défini est tué lorsqu’elle atteint sa propre limite, même si l’hôte dispose encore de mémoire libre.

#swap#memory#oom#zram#linux-performance