}
*
@
X
#
$

NOUS LES DEVS

Augmenter la RAM d'un serveur Linux grâce au SWAP

Allouer de l’espace disque en tant que mémoire RAM

Niveau : débutant(e)
</> </> </>

Dimensionnement

Lorsque tu achètes un serveur, notamment une instance dans le cloud, dans la plupart des cas tu vas essayer de le dimensionner, c’est-à-dire adapter très précisément ses ressources pour trouver un équilibre entre le coût et la performance.

Le dimensionnement d’une instance repose principalement sur trois métriques : le nombre de cœurs (CPU), la quantité de RAM et l’espace disque.

Et puisque cela va avoir son importance, il faut toujours s’assurer que le disque est bien un vrai SSD, car ce n’est pas systématique.

La problématique

J’ai eu la brillante idée de déplacer un serveur GitLab que j’avais configuré sur un Lightsail AWS vers une autre machine deux fois plus puissante, mais deux fois moins chère. Autant te dire que sur le papier, c’était très chouette, mais la réalité en a décidé autrement. L’installation s’est soldée par une interface GitLab inaccessible, des CPU qui tournaient à fond et un noyau qui balançait des erreurs de mémoire à tout-va.

Pourtant, tout semblait cohérent, un serveur plus puissant, des requirements GitLab respectés, puisque d’après GitLab, en environnement restreint, il faut 1 core (architecture AMD64), 3 Go de RAM et 20 Go d’espace disque. J’ai même lu plusieurs articles sur internet qui s’alignaient sur ma précédente config.

SWAP à la rescousse

Pour être honnête, on tournait sur une version qui n’était pas la toute dernière, mais GitLab se doit de tourner sur cette configuration, surtout vu la taille de notre équipe et l’usage qu’on en fait. Donc pour moi, hors de question d’augmenter les ressources du serveur, mais je devais trouver une solution !

La première idée que j’ai eue a été de désactiver certains services pour améliorer les performances. Ça m’a permis au moins d’accéder à l’interface, mais ça n’a pas tenu longtemps puisque l’import de projets ne fonctionnait pas du tout.

Ensuite j’ai eu un éclair de génie. En un instant j’ai augmenté artificiellement la RAM en utilisant de l’espace disque. Cette technique s’appelle swap (ou « swapper ») et elle a totalement résolu le problème, mieux encore, ça nous a permis de réactiver tous les services.

État initial

Pour ajouter et configurer du swap, commence par établir une connexion SSH à ton serveur.

Ensuite, tape la commande free -h qui va t’afficher ta consommation de RAM.

free -h

De mon côté, tu peux voir que j’ai 130Mi de disponible et que je suis vraiment au ras des pâquerettes. Au niveau du swap, les valeurs sont à 0B donc il n’y a pas du tout de swap configuré.

               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       3.4Gi       130Mi        98Mi       593Mi       386Mi
Swap:             0B          0B          0B

Tester le débordement de RAM

Pour savoir s’il y a un manque de mémoire, j’installe stress un programme qui va volontairement consommer de la RAM.

sudo apt install stress

Je demande au programme d’utiliser 2 giga de mémoire afin de voir ce qu’il se passe.

stress --vm 1 --vm-bytes 2G --timeout 30

Quelques secondes plus tard, la console affiche des FAIL et des WARN qui m’indiquent que le test a échoué.

stress: info: [16809] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [16809] (425) <-- worker 16810 got signal 9
stress: WARN: [16809] (427) now reaping child worker processes
stress: FAIL: [16809] (461) failed run completed in 1s

Il existe également une commande qui, combinée avec un grep, te permet de savoir s’il y a eu des alertes de type « out of memory » dans le système. C’est le meilleur moyen de savoir si tu as un problème de RAM.

journalctl -k | grep -i "out of memory"

Comme tu peux le constater, j’obtiens un joli message d’erreur, notamment depuis le programme stress.

May 03 07:04:12 vps-0d982759 kernel: Out of memory: Killed process 16725 (ruby) total-vm:1516288kB, anon-rss:1130556kB, file-rss:0kB, shmem-rss:2492kB, UID:994 pgtables:2764kB oom_score_adj:0
May 03 07:04:12 vps-0d982759 kernel: Out of memory: Killed process 16810 (stress) total-vm:2100528kB, anon-rss:1714768kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:3408kB oom_score_adj:0

Ajouter du SWAP

Mon objectif maintenant est de faire en sorte qu’il n’y ait plus de problème de mémoire, et pour ce faire je vais ajouter de la mémoire swap.

Juste avant de commencer, je passe en mode super utilisateur via la commande suivante, ce qui m’évitera de taper sudo à chacune de mes commandes.

sudo su

La première chose à faire est de contrôler qu’il n’y a pas déjà de swap activé. Normalement cette commande ne devrait rien afficher en console.

swapon --show

Ensuite je vais créer un fichier qui servira d’espace d’échange. Je peux définir sa taille ainsi que son emplacement. Moi j’ai décidé d’allouer 4G et de placer ce fichier à la racine en le nommant SWAP, j’exécute donc la commande suivante.

sudo fallocate -l 4G /SWAP

Je définis les droits adéquats pour ce fichier.

chmod 600 /SWAP

La commande mkswap permet de définir que ce fichier va servir de fichier d’échange.

mkswap /SWAP

En console tu devrais voir quelque chose qui ressemble à ceci.

Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=68aa8958-18a8-465c-a03a-66955696efde

Ensuite j’active le swap.

swapon /SWAP

En retapant free -h, je constate que maintenant le Swap est à 4G.

               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       3.4Gi       144Mi       101Mi       511Mi       308Mi
Swap:          4.0Gi          0B       4.0Gi

Vérifier le fonctionnement

Afin de vérifier le fonctionnement de la mémoire swap, je vais relancer un stress test et observer ce qu’il se passe au niveau de la RAM ainsi que ce qui est émis dans journalctl.

stress --vm 1 --vm-bytes 2G --timeout 30

Cette fois-ci on peut voir qu’il n’y a plus d’erreur et que le test est passé avec succès.

stress: info: [17655] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [17655] successful run completed in 30s

Un petit coup de free -h me permet de voir que le swap est bien utilisé.

               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       2.0Gi       1.8Gi        72Mi       252Mi       1.8Gi
Swap:          4.0Gi       2.0Gi       2.0Gi

Swappiness

La prochaine étape est de configurer de quelle manière le swap va être utilisé, et pour ça il existe une option appelée swappiness.

Swappiness est une variable qui détermine à quelle vitesse les processus sont déplacés de la RAM vers le disque afin de libérer celle-ci. Elle prend une valeur comprise entre 0 et 100.

A la valeur 0, le noyau ne l’utilise que lorsque cela est vraiment nécessaire afin d’éviter les erreurs de manque de mémoire. 10 c’est la valeur recommandée quand le système à beaucoup de RAM. 60 est la valeur par défaut, et le système écrit immédiatement dans le Swap lorsque c’est configuré à 100.

Pour définir cette valeur, édite le fichier /etc/sysctl.conf.

vim /etc/sysctl.conf

Vu que je veux uniquement pallier à des problèmes d’erreur mémoire je vais choisir une valeur assez basse, j’ajoute donc la ligne suivante tout en bas du fichier.

vm.swappiness=10

Ensuite, tu peux charger la configuration en exécutant la commande suivante.

sudo sysctl -p

Reboot

Malgré que le swap fonctionne, celui-ci n’est pas persistant. Si je reboot le serveur ou s’il vient à redémarrer pour une raison ou une autre, il faudra alors recommencer une partie des opérations.

Voici le résultat d’un free -h après avoir reboot. Tu peux voir qu’il n’y a plus de swap disponible.

               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       1.5Gi       1.6Gi        78Mi       968Mi       2.2Gi
Swap:             0B          0B          0B

Avec ls je peux voir que mon fichier d’échange est toujours disponible.

ls -la /

-rw-------   1 root root 4294967296 May  3 07:57 SWAP

Je réexécute les deux commandes qui m’intéressent pour ré-activer le swap.

mkswap /SWAP && swapon /SWAP

Je vérifie que le swap est bien activé.

swapon --show

NAME  TYPE SIZE USED PRIO
/SWAP file   4G   0B   -2

Pour monter automatiquement le swap au démarrage de la machine, il va falloir l’ajouter à la table des partitions.

Commence par ouvrir le fichier /etc/fstab.

vim /etc/fstab/

Ajoute tout en bas du fichier la ligne suivante (adapte le chemin et le nom du fichier swap en fonction de ce que tu as choisi).

# Swap file created on 03/05/2025
/SWAP       none    swap    sw      0       0

Et maintenant si je reboot et qu’ensuite j’inspecte la mémoire, je vois bien que le swap est toujours présent et contient bien 4G.

               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       3.3Gi       122Mi        94Mi       680Mi       463Mi
Swap:          4.0Gi       2.0Mi       4.0Gi

Swap de fin !

Si ton application avait besoin d’un tout petit peu plus de RAM, eh bien maintenant c’est chose faite grâce au swap, et tu sais même le configurer toi-même !

Le swap ce n’est pas forcément une bonne chose, car écrire sur le disque est moins performant que sur de la RAM. Mais dans notre cas et sur l’architecture matérielle sur laquelle nous nous trouvons, on ne voit pas la différence et ça a totalement résolu notre problème.

A ce stade, j’aurais même tendance (sur des petites configurations) à toujours configurer un swap en mode swappiness 0 juste par mesure de sécurité.

Voilà, j’espère que ce tuto t’aura aidé. Tu pourras également retrouver la liste des commandes que j’ai utilisées sur la documentation officielle de Debian.

18/05/2025

Yann Vangampelaere - nouslesdevs -

NOUS LES DEVS

Vous aimez ce que je fais ? Vous voulez que j'en fasse plus ? dans le développement du blog.