l’Almanet doLys Gnu/Linux – Open Source – Entreprises › Forums › L’almanet doLys Open Source › Optimiser la gestion de la RAM et du Swap sous Linux
- This topic has 16 réponses, 5 participants, and was last updated il y a 5 years et 12 months by
nam1962.
- AuteurArticles
- janvier 28, 2018 à 1:16 pm #5611
Linux gère déjà très bien la mémoire tout seul. Mais quelques réglages et surtout une bonne organisation de la swap peuvent rendre une machine plus confortable quand la RAM commence à manquer.
Et pour moi, même avec beaucoup de RAM : on DOIT avoir une swap 😉
Commençons par regarder ce que fait réellement la machine avant de toucher aux réglages.
1 – Voir l’état de la RAM et de la swap
Pour voir la mémoire :
free -hNe vous inquiétez pas si Linux utilise beaucoup de RAM. Il profite de la mémoire disponible pour ses caches et sait la récupérer quand une application en a besoin.
Dans la sortie de
free, regardez surtout la colonne :availablePour voir les espaces de swap actifs :
swapon --showPour voir si zram est utilisée :
zramctlEt les deux réglages mémoire qui nous intéressent ici :
cat /proc/sys/vm/swappiness cat /proc/sys/vm/vfs_cache_pressure2 – Faut-il vraiment une swap ?
Pour moi : oui, on DOIT avoir une swap, même avec beaucoup de RAM.
Linux peut fonctionner sans swap. Quand la RAM vient à manquer, il dispose alors de moins de possibilités pour libérer de la mémoire et peut finir par tuer des processus avec l’OOM killer.
Avec une swap disponible, le noyau peut déplacer des pages mémoire peu utilisées et conserver davantage de RAM pour ce qui travaille réellement.
Ça ne transforme évidemment pas un SSD en RAM. Une machine qui passe son temps à lire et écrire plusieurs gigaoctets de swap disque va ramer. Mais je préfère largement disposer d’une réserve quand arrive un gros pic de mémoire.
J’aime donc avoir une swap assez confortable lorsque l’espace disque le permet. J’ai ainsi réussi à faire tourner Nextcloud + Collabora sur un petit VPS avec seulement 1 Go de RAM et 75 Go de SSD. Là, la swap n’était franchement pas décorative 😛
3 – Partition, swapfile, zram : qu’est-ce que j’ai ?
La commande :
swapon --showvous dira ce qui est réellement utilisé.
Vous pouvez rencontrer :
- une partition swap sur le disque ;
- un swapfile, donc un fichier utilisé comme swap ;
- une zram, espace compressé conservé en RAM.
On peut également combiner zram et une swap sur disque. C’est une configuration que j’aime bien : zram absorbe en priorité une partie de la pression mémoire et la swap disque reste disponible derrière si ça chauffe vraiment.
Une partition swap existante qui fonctionne correctement n’a aucune raison d’être supprimée juste pour la remplacer par un fichier.
4 – Créer un swapfile
Le swapfile est pratique : sa taille peut être choisie sans repartitionner le disque.
Vérifiez d’abord ce que vous avez :
swapon --show lsblk -f findmnt -no FSTYPE /Et vérifiez qu’un fichier
/swapfilen’existe pas déjà :ls -lh /swapfileLes commandes suivantes sont donc à utiliser pour créer un nouveau swapfile, pas pour écraser tranquillement celui qui existe déjà !
Sur ext4 et les systèmes de fichiers classiques
Exemple avec un swapfile de 8 Gio :
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfileVérifiez :
swapon --showPuis ajoutez-le au démarrage :
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabEt contrôlez :
tail -n 5 /etc/fstabSi votre système est en Btrfs
Btrfs demande un swapfile préparé spécialement pour son fonctionnement Copy-on-Write.
La commande dédiée simplifie le travail :
sudo btrfs filesystem mkswapfile --size 8G /swapfile sudo chmod 600 /swapfile sudo swapon /swapfilePuis :
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabVérifiez toujours le résultat :
swapon --showSi vous utilisez des snapshots Btrfs, gardez en tête qu’un sous-volume contenant un swapfile actif a des contraintes particulières. Évitez donc de déposer votre swapfile n’importe où dans une arborescence que vous snapshottez sans arrêt.
5 – Quelle taille de swap choisir ?
Il n’y a pas une taille magique valable pour toutes les machines.
Je regarde surtout :
- la quantité de RAM ;
- la charge réelle de la machine ;
- l’espace disponible sur le SSD ;
- la possibilité d’avoir de gros pics de mémoire ;
- l’utilisation éventuelle de l’hibernation.
Sur une machine de bureau avec suffisamment de stockage, je préfère avoir quelques gigaoctets de réserve plutôt que chercher à économiser 4 ou 8 Gio sur un SSD de plusieurs centaines de gigaoctets.
Sur une petite machine ou un VPS disposant de très peu de RAM, une swap confortable peut faire une énorme différence lors d’une pointe de consommation.
Si votre machine passe en permanence plusieurs gigaoctets dans la swap, le problème devient cependant la quantité de RAM disponible ou la consommation des applications. Augmenter encore la swap évitera peut-être le crash, mais ne rendra pas le disque aussi rapide que la mémoire vive 😉
6 – zram : compresser de la mémoire plutôt que taper tout de suite dans le disque
zram crée un périphérique compressé en RAM utilisé comme swap.
Les pages compressibles prennent moins de place et restent accessibles beaucoup plus rapidement que si elles avaient été écrites sur un SSD ou un disque dur.
La taille affichée par
zramctlreprésente la capacité logique du périphérique zram. Cela ne signifie pas qu’autant de RAM physique est immédiatement réservée.Vérifiez d’abord si zram existe déjà :
zramctl swapon --showSi une zram est déjà active, inutile d’installer un second gestionnaire par-dessus.
Debian
On peut utiliser :
sudo apt install zram-toolsPour une zram pouvant représenter jusqu’à 50 % de la RAM et utilisée avant la swap disque, éditez :
sudoedit /etc/default/zramswapet utilisez :
PERCENT=50 PRIORITY=100Je laisse généralement l’algorithme de compression choisi par le système sauf raison précise de le modifier.
Puis :
sudo systemctl enable --now zramswap.serviceSi vous venez de modifier la configuration :
sudo systemctl restart zramswap.serviceContrôlez :
zramctl swapon --showEndeavourOS, CachyOS, Manjaro et autres Arch
Installez :
sudo pacman -S zram-generatorPuis créez :
sudoedit /etc/systemd/zram-generator.confavec :
[zram0] zram-size = ram / 2 swap-priority = 100Rechargez systemd et lancez la zram :
sudo systemctl daemon-reload sudo systemctl start systemd-zram-setup@zram0.serviceVérifiez :
zramctl swapon --showLa priorité est importante : plus elle est élevée, plus cet espace de swap sera choisi en premier. Avec une zram à priorité 100 et une swap disque à priorité inférieure, Linux utilisera donc d’abord la zram.
7 – Et zswap ?
zswap travaille différemment. Il sert de cache compressé en RAM devant une vraie swap persistante.
Quand une page doit être swappée, zswap essaie de la conserver compressée en mémoire. Si son cache ne peut plus la garder, elle peut ensuite être écrite dans la swap sur disque.
Pour voir son état :
cat /sys/module/zswap/parameters/enabledVous obtiendrez généralement :
You :
NSur une machine où zram assure déjà la swap compressée principale, je n’empile pas zswap par-dessus sans raison précise.
zswap m’intéresse surtout lorsqu’on conserve une swap sur SSD ou disque et qu’on veut limiter une partie des entrées/sorties vers ce support.
Son activation permanente passe par les paramètres du noyau et dépend aussi du chargeur de démarrage utilisé. Vérifiez donc d’abord s’il est déjà actif avant de modifier GRUB ou systemd-boot.
8 – Régler la swappiness
La
swappinessindique au noyau le coût relatif qu’il doit attribuer au swap par rapport à la récupération de pages du cache fichier.Pour connaître sa valeur :
cat /proc/sys/vm/swappinessLa plage va de 0 à 200.
La valeur par défaut du noyau est :
60Ce n’est pas un « réglage serveur ». C’est simplement la valeur générique du noyau.
Avec une swap lente sur disque, une valeur plus basse peut parfois convenir. Avec une swap très rapide en mémoire comme zram, une valeur de 100 ou davantage peut parfaitement avoir du sens.
Je vous déconseille donc de recopier une valeur trouvée dans un tuto sans regarder votre configuration.
Pour essayer temporairement une valeur, par exemple 100 :
sudo sysctl vm.swappiness=100Vérifiez :
cat /proc/sys/vm/swappinessLe changement disparaîtra au redémarrage. C’est pratique pour tester avant de graver quoi que ce soit dans la configuration.
Si le comportement vous convient et que vous voulez conserver cette valeur :
echo 'vm.swappiness=100' | sudo tee /etc/sysctl.d/99-swappiness.conf sudo sysctl --systemAvec uniquement une swap SSD classique, je commencerais simplement avec la valeur par défaut. Avec zram, on peut tester plus haut et observer le résultat sous sa vraie charge de travail.
9 – vfs_cache_pressure
Pour voir sa valeur :
cat /proc/sys/vm/vfs_cache_pressureCe réglage agit sur la tendance du noyau à récupérer les caches contenant notamment les dentries et les inodes utilisés pour accéder aux fichiers.
Je laisse normalement :
100Une valeur plus basse conserve davantage ces structures en mémoire. Cela peut aider certaines charges très particulières, mais ce n’est pas une optimisation automatique du poste de travail.
Sans mesure montrant un problème précis, laissez ce réglage tranquille.
10 – Swap et SSD
Un SSD peut parfaitement héberger une swap.
Les accès disque restent nettement plus lents que la RAM, mais désactiver ou réduire brutalement la swap simplement parce qu’on possède un SSD n’apporte rien de magique.
zram ou zswap permettent en plus d’éviter une partie des écritures lorsque les pages peuvent rester compressées en mémoire.
Le vrai indicateur reste l’usage :
swapon --showSi votre swap SSD contient quelques pages froides pendant que la machine reste fluide, il n’y a pas de catastrophe à réparer.
11 – Hibernation : attention à la différence avec zram
Lors d’une hibernation, le contenu nécessaire à la reprise doit survivre à l’extinction de la machine.
zram vit en mémoire vive et disparaît donc lorsque l’alimentation est coupée.
Si vous utilisez l’hibernation, gardez une swap persistante sur partition ou fichier, suffisamment grande pour accueillir l’image d’hibernation, et configurez correctement le mécanisme
resumede votre distribution.Vous pouvez conserver zram en priorité pour le fonctionnement normal et une swap disque derrière pour les gros dépassements de mémoire et l’hibernation.
Avoir une swapfile ne suffit cependant pas à rendre automatiquement l’hibernation fonctionnelle. Le système doit savoir sur quel espace reprendre l’image et, avec certains systèmes de fichiers comme Btrfs, la configuration demande des précautions supplémentaires.
12 – Observer la machine en situation réelle
Une optimisation mémoire se juge pendant que l’ordinateur fait réellement ce qu’on lui demande.
Pour regarder RAM et swap évoluer :
watch -n 2 'free -h; echo; swapon --show'Si vous utilisez zram :
watch -n 2 zramctlPour voir l’activité mémoire et les entrées/sorties seconde par seconde :
vmstat 1Dans
vmstat, les colonnes :si somontrent les entrées et sorties de swap.
Un peu de swap utilisée n’indique pas à elle seule un problème. Des échanges massifs et continus accompagnés de gros ralentissements indiquent en revanche que la pression mémoire est réelle.
13 – Si une application disparaît faute de mémoire
Pour chercher un passage de l’OOM killer dans les messages du noyau :
journalctl -k -b | grep -Ei 'out of memory|oom|killed process'Si vous trouvez ce genre d’événement, regardez ensuite la RAM disponible, la quantité de swap et surtout quel programme consommait la mémoire.
Une swap plus grande peut éviter la mort brutale d’un processus et laisser le temps de finir un gros travail. Si la charge normale dépasse continuellement la RAM disponible, il faudra aussi agir sur les applications ou ajouter de la mémoire.
14 – Ma configuration pratique
Pour un poste Linux moderne, j’aime bien cette organisation :
- une swap persistante sur SSD ou une partition swap ;
- zram avec une priorité supérieure ;
- une swappiness choisie après avoir observé le comportement réel ;
- aucun réglage exotique ajouté simplement parce qu’il existe.
Sur une machine avec beaucoup de RAM, la swap disque restera souvent presque vide. Elle est là pour le jour où elle devient utile.
Sur une petite machine, zram peut repousser assez loin le moment où le système doit écrire sur le disque.
Et sur un tout petit serveur, une grosse swap peut faire la différence entre un service qui ralentit pendant un pic et un service qui se fait tuer. Je préfère prévoir le parachute avant de sauter 😉
15 – Les commandes à garder sous la main
free -h swapon --show zramctl cat /proc/sys/vm/swappiness cat /proc/sys/vm/vfs_cache_pressure vmstat 1Avec ça, vous savez déjà beaucoup mieux ce que fait votre mémoire que quelqu’un qui colle au hasard une valeur de swappiness trouvée sur Internet 😉
Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
juin 10, 2019 à 10:36 pm #11509bonjour nam et tous
pourquoi ne pas avoir plusieurs récipiendaires pour la swap et définir des priorités?j’ utilise zram (je sais: t’ aime pas) qui crée un tampon swap en mémoire vive
explication vachement initiale
et aprés utilisation de swapoff swapon pour définir les piorités:pj@pj-desktop:~$ cat /proc/swaps Filename Type Size Used Priority /dev/sda9 partition 4364284 0 -3 /dev/zram0 partition 1000112 0 -1 /dev/zram1 partition 1000112 0 -2les zram0 et zram1 correspondent aux 2 cœurs de ma cpu: eles devraient avoir la même priorité.
j’ obtiens mon systeme extrémement fluide
mon réglage en test (avec 4Go de mem) de /etc/sysctl.d/99-swappiness.conf:
vm.swappiness=10
vm.vfs_cache_pressure=100edit: tu l’ as crée le /etc/systemd/swap.conf ?
juin 11, 2019 à 2:37 am #11510Hello andso, l’avantage de systemd-swap est qu’il crée des tranches de swap de 512 Mo au fur et à mesure des besoins.
le /etc/systemd/swap.conf a été créé lors de l’install de systemd-swap, j’ai juste dû activer swapfc
Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
décembre 4, 2019 à 10:09 pm #11612t’ as pas pigé: zram compresse ta ram et l’ utilise en tampon pour le swap,
en réglant /proc/swaps
avant basculement vers un dédé.
Tu suis le script de GammaDraconis sur ubuntu qui propose zram.Un swap en mémoire vive avant basculement vers un dédé,
ça roxe!janvier 15, 2020 à 9:37 pm #11633Bonjour,
Je n’arrive pas à appliquer la partie gitub et trouver le numéro de .deb
Par le passé j’ai déjà effectuer cette manipulation, mais je n’y arrive pas cette fois ci.
Cdlt
janvier 25, 2020 à 10:16 am #11640Hello !
Effectivement, any est devenu all dans systemd-swap_*_any.deb
Je corrige le tuto, merci ! 🙂Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
mars 21, 2020 à 4:39 pm #11683Bonjour,
je suis novice sur linux et moi non plus la manip de remplacer * par le numéro de version dans le .deb ne fonctionne pas.
Cela me fait :
elsa@elsa-X510UQ:~/systemd-swap$ sudo dpkg -i systemd-swap_4.0.1_all.deb
dpkg: erreur: cannot access archive ‘systemd-swap_4.0.1_all.deb’: Aucun fichier ou dossier de ce type.
Pourraiez-vous m’aider ?Cordialement
mars 21, 2020 à 9:20 pm #11684Bonsoir, peux-tu nous donner un à un les retours de chacune des commandes prescrites ?
La commande que tu indiques ne provient pas du tuto dolys.
Il faut exactement copier coller les commandes du premier post, sans rien y modifier.Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
mars 21, 2020 à 10:10 pm #11685Si je fais chaque commande j’obtiens :
elsa@elsa-X510UQ:~$ git clone https://github.com/Nefelim4ag/systemd-swap.git
fatal: le chemin de destination ‘systemd-swap’ existe déjà et n’est pas un répertoire vide.
elsa@elsa-X510UQ:~$ ./systemd-swap/package.sh debian
./systemd-swap/package.sh: ligne 16: make : commande introuvable
elsa@elsa-X510UQ:~$ cd ~/systemd-swap
elsa@elsa-X510UQ:~/systemd-swap$ sudo dpkg -i systemd-swap_*_a??.deb
[sudo] Mot de passe de elsa :
dpkg: erreur: cannot access archive ‘systemd-swap_*_a??.deb’: Aucun fichier ou dossier de ce typemars 22, 2020 à 4:25 pm #11686Hmm, les *buntus oublient de plus en plus d’outils dans leur install, que donne :
sudo apt install --reinstall build-essential ./systemd-swap/package.sh debian cd ~/systemd-swap sudo dpkg -i systemd-swap_*_a??.debUn jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
mars 23, 2020 à 11:56 am #11687Super ! j’imagine que c’est bon, on m’indique :
elsa@elsa-X510UQ:~$ swapon -s
Nom de fichier Type Taille Utilisé Priorité
/var/lib/systemd-swap/swapfc/1 file 524284 0 -2Ensuite pour désactiver l’hibernation je n’ai pas très bien compris : Dans mon fichier etc je n’ai pas defaul ou mkinitcpio.conf, je n’ai que systemd.
Du coup après avoir fait la commande que tu préconise ça me donne :elsa@elsa-X510UQ:~$ sudo update-grub
Sourcing file `/etc/default/grub’
Création du fichier de configuration GRUB…
Image Linux trouvée : /boot/vmlinuz-5.3.0-42-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.3.0-42-generic
Image Linux trouvée : /boot/vmlinuz-5.3.0-28-generic
Image mémoire initiale trouvée : /boot/initrd.img-5.3.0-28-generic
Adding boot menu entry for EFI firmware configuration
fait
elsa@elsa-X510UQ:~$ sudo mkinitcpio -P
sudo: mkinitcpio : commande introuvableça te parait bon ?
mars 23, 2020 à 4:51 pm #11688Çà sent bon 🙂
Pour vérifier, donne-nous :
cat /etc/default/grub cat /etc/mkinitcpio.confUn jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
mars 23, 2020 à 7:20 pm #11690Voilà :
elsa@elsa-X510UQ:~$ cat /etc/default/grub # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. # For full documentation of the options in this file, see: # info -f grub -n 'Simple configuration' GRUB_DEFAULT=0 GRUB_TIMEOUT_STYLE=hidden GRUB_TIMEOUT=0 GRUB_DISTRIBUTOR=<code>lsb_release -i -s 2> /dev/null || echo Debian</code> GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMDLINE_LINUX="" # Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...) #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef" # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command vbeinfo' #GRUB_GFXMODE=640x480 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entries #GRUB_DISABLE_RECOVERY="true" # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1" elsa@elsa-X510UQ:~$ cat /etc/mkinitcpio.conf cat: /etc/mkinitcpio.conf: Aucun fichier ou dossier de ce typemars 24, 2020 à 10:42 am #11691Là c’est bon, semble-t’il.
J’ai amendé le tuto pour intégrer l’installation de build-essential
Merci ! 🙂
Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
mars 24, 2020 à 11:20 am #11692Super, merci beaucoup Nam, ton tuto est génial je m’y réfère à chaque fois que je formate (j’ai du l’utiliser 4 ou 5 fois).
Bonne continuation ! - AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.