Optimiser la gestion de la RAM et du Swap sous Linux

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

15 sujets de 1 à 15 (sur un total de 17)
  • Auteur
    Articles
  • #5611
    nam1962nam1962
    Keymaster

      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 -h

      Ne 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 :

      available

      Pour voir les espaces de swap actifs :

      swapon --show

      Pour voir si zram est utilisée :

      zramctl

      Et les deux réglages mémoire qui nous intéressent ici :

      cat /proc/sys/vm/swappiness
      cat /proc/sys/vm/vfs_cache_pressure

      2 – 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 --show

      vous 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 /swapfile n’existe pas déjà :

      ls -lh /swapfile

      Les 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 /swapfile

      Vérifiez :

      swapon --show

      Puis ajoutez-le au démarrage :

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

      Et contrôlez :

      tail -n 5 /etc/fstab

      Si 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 /swapfile

      Puis :

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

      Vérifiez toujours le résultat :

      swapon --show

      Si 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 zramctl repré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 --show

      Si une zram est déjà active, inutile d’installer un second gestionnaire par-dessus.

      Debian

      On peut utiliser :

      sudo apt install zram-tools

      Pour une zram pouvant représenter jusqu’à 50 % de la RAM et utilisée avant la swap disque, éditez :

      sudoedit /etc/default/zramswap

      et utilisez :

      PERCENT=50
      PRIORITY=100

      Je 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.service

      Si vous venez de modifier la configuration :

      sudo systemctl restart zramswap.service

      Contrôlez :

      zramctl
      swapon --show

      EndeavourOS, CachyOS, Manjaro et autres Arch

      Installez :

      sudo pacman -S zram-generator

      Puis créez :

      sudoedit /etc/systemd/zram-generator.conf

      avec :

      [zram0]
      zram-size = ram / 2
      swap-priority = 100

      Rechargez systemd et lancez la zram :

      sudo systemctl daemon-reload
      sudo systemctl start systemd-zram-setup@zram0.service

      Vérifiez :

      zramctl
      swapon --show

      La 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/enabled

      Vous obtiendrez généralement :

      Y

      ou :

      N

      Sur 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 swappiness indique 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/swappiness

      La plage va de 0 à 200.

      La valeur par défaut du noyau est :

      60

      Ce 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=100

      Vérifiez :

      cat /proc/sys/vm/swappiness

      Le 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 --system

      Avec 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_pressure

      Ce 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 :

      100

      Une 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 --show

      Si 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 resume de 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 zramctl

      Pour voir l’activité mémoire et les entrées/sorties seconde par seconde :

      vmstat 1

      Dans vmstat, les colonnes :

      si
      so

      montrent 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 1

      Avec ç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

      #11509
      andsoandso
      Participant

        bonjour 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	-2
        

        les 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=100

        edit: tu l’ as crée le /etc/systemd/swap.conf ?

        #11510
        nam1962nam1962
        Keymaster

          Hello 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

          #11612
          andsoandso
          Participant

            t’ 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!

            #11633
            Avatargog
            Participant

              Bonjour,

              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

              #11640
              nam1962nam1962
              Keymaster

                Hello !
                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

                #11683
                Avatarfurnicket
                Participant

                  Bonjour,
                  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

                  #11684
                  nam1962nam1962
                  Keymaster

                    Bonsoir, 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

                    #11685
                    Avatarfurnicket
                    Participant

                      Si 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 type

                      #11686
                      nam1962nam1962
                      Keymaster

                        Hmm, 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??.deb

                        Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc

                        #11687
                        Avatarfurnicket
                        Participant

                          Super ! 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 -2

                          Ensuite 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 ?

                          #11688
                          nam1962nam1962
                          Keymaster

                            Çà sent bon 🙂

                            Pour vérifier, donne-nous :

                            cat /etc/default/grub 
                            cat /etc/mkinitcpio.conf

                            Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc

                            #11690
                            Avatarfurnicket
                            Participant

                              Voilà :

                              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 type
                              #11691
                              nam1962nam1962
                              Keymaster

                                Là 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

                                #11692
                                Avatarfurnicket
                                Participant

                                  Super, 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 !

                                15 sujets de 1 à 15 (sur un total de 17)
                                • Vous devez être connecté pour répondre à ce sujet.