Journal Améliorer vos ordinateurs avec zRam !

Posté par . Licence CC by-sa
27
2
oct.
2011

Bonsoir,

Vous avez un ordinateur avec peu de RAM ? Il rame (mauvais jeu de maux) lorsque vous utilisez votre navigateur fétiche avec plus de 3 onglets ?

zRam est fait pour vous !

Qu'est-ce que c'est ?

Pour faire simple, cela permet de rendre votre RAM plus importante (virtuellement) en compressant (LZO) une partie de cette dernière.
Pour être plus complet et donc plus juste, on peut aller lire les articles de patrick_g :

Comment on fait pour activer cette fonctionnalité ?

  • Pré-requis : kernel linux > 2.6.37.1

Sous Ubuntu (11.04 et 11.10), on peut utiliser le ppa:shnatsel/zram :

sudo add-apt-repository ppa:shnatsel/zram
sudo apt-get update
sudo apt-get install zramswap-enabler

Sinon, il y a les sources du script.

  • # Pas d'effets inverses ?

    Posté par . Évalué à  10 .

    Oui mais le fait de devoir compresser puis décompresser la RAM pour y écrire ou lire doit surement tirer sur le proco non ? Avec ça, ce que l'on gagne d'un côté ne le perds pas t'on de l'autre ?

    • [^] # Re: Pas d'effets inverses ?

      Posté par (page perso) . Évalué à  -9 .

      si tu suis le dernier lien, tu verras que ta remarque est inutile ...

      • [^] # Re: Pas d'effets inverses ?

        Posté par . Évalué à  7 .

        Si je suis le lien je tombe vers une page qui teste uniquement les débits de la RAM avant et après zRAM, pas en utilisation pratique, par exemple en ouvrant une application.

        • [^] # Re: Pas d'effets inverses ?

          Posté par . Évalué à  4 .

          Si je suis le lien je tombe vers une page qui teste uniquement les débits de la RAM avant et après zRAM, pas en utilisation pratique, par exemple en ouvrant une application.

          Tu tombes aussi sur un lien avec un benchmark sur un CPU Intel Core 2 Duo (T9600, 2.8GHz) avec 4 Go de RAM. C'est a dire une gamme de CPU récente qui a limite la zlib incluse (j'exagère, mais je veux dire que c'est optimisé pour). Contrairement Mme Michu qui voudra utiliser zram pour son vieux PIII (pas très optimisé pour faire du DEFLATE) avec 128 Mo de RAM.

          Knowing the syntax of Java does not make someone a software engineer.

          • [^] # Re: Pas d'effets inverses ?

            Posté par . Évalué à  8 .

            Cette technique de compression de la RAM existe depuis la nuit des temps avec linuxcompressed sur les 2.4 et compcache sur les 2.6. Je me souviens de pas mal de benchs à l'époque, et tu devrais pouvoir les retrouver facilement via kerneltrap. De mémoire le résultat varie grandement en fonction de ta machine, de ta config et de ta workload. Au pire c'est équivalent à utiliser du swap, et avec de la chance t'as un joli speed up.

  • # Fedora...

    Posté par . Évalué à  3 .

    Ça a l'air sympathique. Pour les fedoristes, zram est disponible dans le paquet « kmod-staging » de RPM Fusion.
    Reste à convertir le script d'init pour systemd...

  • # Et si je ne manque pas de RAM?

    Posté par (page perso) . Évalué à  2 .

    Projet intéressant!
    Cependant, a-t-il une réelle utilité si j'ai déjà 4G de RAM? En effet, je ne suis jamais à cours de RAM, ZRAM peut-il donc avoir un effet bénéfique sur mon système?
    Si je m'en tient au compte-rendu du dernier lien, nous sommes tentés de le croire car le benchmark utilise un PC avec un Core 2 Duo et 4G de RAM. Quelqu'un peut-il me le confirmer?

    -d(o_O)b- Siick

    • [^] # Re: Et si je ne manque pas de RAM?

      Posté par . Évalué à  4 .

      Quelle que soit la quantité de RAM que tu possèdes, l'intérêt de zRAM c'est quand tu n'en as pas assez.
      Avec 4Go tu peux te retrouver juste si tu fais de la virtualisation d'autres OS par exemple. Avec zRAM, ça te permettrait d'allouer un peu plus de RAM à chacune de tes VM.

  • # Ahah

    Posté par . Évalué à  6 .

    Je m'attendais tellement à un journal-boutade-bookmark qui se résumerait à ce lien:

    http://haklia.free.fr/ram/

    THIS IS JUST A PLACEHOLDER. YOU SHOULD NEVER SEE THIS STRING.

    • [^] # Re: Ahah

      Posté par . Évalué à  1 .

      Ça déconne ton site, au niveau de l'UTF8.

  • # Compléments

    Posté par . Évalué à  9 .

    Zram ne permet pas d'avoir plus de RAM en la compressant, il permet d'avoir un disque compressé en RAM. Bon globalement, ça permet quand même d'avoir un peu plus de mémoire disponible puisqu'on a par défaut :

    Mém. dispo. = ¼ RAM * n + ¾ RAM, avec n, ratio de compression des données, qui varie mais est le plus souvent supérieur à 1.

    (LZO compresse un peu moins bien que gzip.)

    On formate ensuite le disque avec le format qu'on veut. Comme zram descend de compcache/ramzswap (ça va finir par être pire que firefox/phoenix/firebird) qui était un pilote permettant d'avoir un swap compressé, l'habitude fait donc que c'est souvent en swap que le disque compressé est utilisé.

    Lorsqu'on a un disque compressé en swap, on règle un priorité haute sur celui-ci afin que le système l'utilise avant le swap du disque dur. Ça permet de commencer à swapper tout en conservant de très bonnes performances.

    Cela fait déjà quelques temps que certaines distributions utilisent discrètement zram, Ubuntu sur ses live-CD ou PCLinux Openbox.

    The capacity of the human mind for swallowing nonsense and spewing it forth in violent and repressive action has never yet been plumbed. -- Robert A. Heinlein

  • # tmpfs

    Posté par (page perso) . Évalué à  2 .

    Juste une question, comme ça :
    Est-ce que avec cette méthode les données stockées dans la ram avec un système de fichier tmpfs se retrouvent compressées elles aussi, ou bien ce n'est que les données utilisées par les programmes ?

    • [^] # Re: tmpfs

      Posté par . Évalué à  3 .

      Ce sont deux systèmes différents. Tmpfs est un système de fichiers en RAM alors que zram est un disque en RAM, disque que l'on peut formater vers n'importe quel FS.

      À ma connaissance il n'y a pas de compression avec tmpfs. Si tu veux un FS en RAM avec compression alors tu peux créer un disque avec zram et le formater en ext2 (on se fiche de la journalisation dans ce cas).

      The capacity of the human mind for swallowing nonsense and spewing it forth in violent and repressive action has never yet been plumbed. -- Robert A. Heinlein

      • [^] # Re: tmpfs

        Posté par . Évalué à  2 .

        Perso. c’est la solution qui m’intéresse. Pouvoir mettre des bouts de mon arborescence en Zram. Pour agir comme un cache du disque. Il reste des problématiques auxquelles je n’ai pas encore trop réfléchi .
        — La sécurité des données (sauf pour /var/tmp et /tmp), il faut régulièrement synchroniser avec le disque dur, j’avais pensé à une arborescence fantôme basée sur un suffixe .bak. au niveau du (des) point(s) de montage Zram, pour la synchro., un logiciel comme Unison bien configuré devrait faire l’affaire.
        — Comment savoir quels fichiers sont régulièrement utilisés ? Inotify ?
        — Je ne suis pas convaincu que le gain en compression compense la perte au niveau performances pures du cache disque du noyau : algo. plus évolué et qui s’adapte aux données (alors que la liste des fichier en RAM avec Zram sera fixe).

        Alors, quelqu’un a déjà essayé ?

        • [^] # Re: tmpfs

          Posté par . Évalué à  3 .

          — Comment savoir quels fichiers sont régulièrement utilisés ? Inotify ?

          Icron peut peut-être répondre à ça. C'est un genre d'équivalent à Cron mais basé sur Inotify

          Il me semble qu'en surveillant tout un répertoire, il est capable de te dire quel fichier a été utilisé et comment (lecture, écrite, etc). À vérifier, car je n'en suis pas sûr.

          Article Quarante-Deux : Toute personne dépassant un kilomètre de haut doit quitter le Tribunal. -- Le Roi de Cœur

          • [^] # Re: tmpfs

            Posté par . Évalué à  2 .

            J’ai rien trouvé sur Icron. Mais Inotify fait bien son boulot, je suis en train de le tester.

            #echo 1048576>/proc/sys/fs/inotify/max_user_watches
            %inotifywatch -r / --exclude /dev /proc>inotify.log
            
            

            Wait & Enjoy !

            total access modify attrib close_write close_nowrite open moved_from moved_to create delete delete_self filename
            223102 120 222145 1 183 233 416 0 0 2 2 0 /home/nicolas/.dm/
            151555 0 151540 0 1 5 6 1 1 1 0 0 /home/nicolas/data/
            14094 14094 0 0 0 0 0 0 0 0 …

            Automatiquement trié, à partir de ça je pense qu’on peut élaborer un stratégie.

        • [^] # Re: tmpfs

          Posté par (page perso) . Évalué à  2 .

          Oui j'ai déjà essayé.

          La synchronisation est basée sur le fait que lorsqu'on monte un point de montage avec l'option bind, on a accès à l'ensemble de son arborescence réelle, pas aux points de montage qui viennent se greffer par dessus.

          Donc en gros, je crée un point de montage pour /var/log … en tempfs.

          je crée un script init qui est chargé de faire les actions suivantes :

          Au démarrage :

          • créer les répertoires à surcharger dans le /tmp (qui est en tempfs sur le système)
          • faire une copie depuis l'origine vers les points de montage créés.

          Au stop :

          • monter la racine dans /tmp avec l'option bind
          • pour les points de montage surcharger, faire un rsync --del entre le tempfs et le système monté dans le /tmp

          Histoire de synchroniser à d'autre moment qu'à l'arret de la machine, j'appelle le script avec l'argument stop de temps en temps dans un cron

          Le script est disponible ici : http://pastebin.com/1rtbf39C

          (je peux le redonner à la demande si le lien venait à disparaître…)

          • [^] # Re: tmpfs

            Posté par . Évalué à  1 .

            Excellent ! Effectivement le mount --bind sera bien plus propre et facile à mettre en place que le système de liens symboliques auquel j’avais pensé.

            Par contre ce ne sont pas les répertoires de log qui me paraissent important à mettre en RAM. Je vais voir pour mettre /lib/i386-linux-gnu/, /etc, /usr/lib/i386-linux-gnu, /bin, des trucs de ~/.kde, c’est ce qui apparaît en premier avec Inotify. Dans un second temps je regarderai l’utilisation disque de certaines applications comme krunner, konsole, zsh (ces deux derniers peuvent être particulièrement long à démarrer), et certainement quelques autres petit trucs pour lesquels l’intéractivité est à privilégier.

            Mais ça dépend beaucoup de l’usage de la machine je suppose ça.

            • [^] # Re: tmpfs

              Posté par (page perso) . Évalué à  2 .

              J'avais mis les log en ram car mon /var était monté sur une carte compact flash (c'est de l'auto hébergement).

              Comme c'est pour un serveur le /home était relativement peu utilisé…

              (J'avais complètement oublié avoir fait ça, j'ai du rallumer la machine pour retrouver le script, ça aura au moins eu l'avantage de le faire sortir de l'oubli !)

            • [^] # Re: tmpfs

              Posté par . Évalué à  2 .

              Je suis intéressé par ta démarche parce que j'utilise kde avec un disque très lent et limiter les accès disques ne serait pas un mal \o/

              • [^] # Re: tmpfs

                Posté par . Évalué à  1 .

                Dans ce cas ce que je viens de découvrir peut t’intéresser.

                Ma base Virtuoso (qui sert à Nepomuk&co) fait 1,5 Go. D’un autre côté on peut régler la quantité de mémoire que Virtuoso-db a le droit d’occuper en RAM, on réglera ceci au minimum. En supposant que ça concerne un chargement partiel de cette base, ça vaudrait le coup de mettre la base en zramfs car la compression lzo (avec lzop --fast) la réduit à 658 Mo !? Bon faut quand même avoir beaucoup de mémoire…

                Mais avec un disque lent, m’étonnerait que tu aies activé Nepomuk :p

                Maintenant, l’information que je cherche : le système de fichier Btrfs va venir avec l’option de montage compress qui peut utiliser LZO. Du coup est-ce que quelqu’un sait si le cache disque profite automatiquement de la compression ? Car dans ce cas l’utilisation de zRam est beaucoup moins intéressante par rapport au cache disque automatique.

                • [^] # Re: tmpfs

                  Posté par . Évalué à  2 .

                  Je laisse Strigi indexer quand je ne suis pas devant l'écran autrement c'est relativement invivable. Ma base fait un peu moins de 900 Mo mais vu que j'ai seulement 1 Go de RAM je ne pense pas que ce soit gérable.

                  Ce qu'il me faudrait c'est que mon .kde4 ou une partie soit monté en RAM au démarrage histoire que la lecture des fichiers soit moins lente.

                  • [^] # Re: tmpfs

                    Posté par . Évalué à  1 .

                    En fait il n’y a quasiment aucun gain de place avec la base de donnée Nepomuk. L’algorithme utilisé dans Zram et celui de Lzop ne doivent pas être identiques, ou alors paramétrés différemment.

                    Pour voir quels sont les fichiers à placer en Zram, cela va dépendre de ton usage.

                    En attendant, voici un script inspiré de celui de Chimrod. Il est perfectible, mais j’ai l’habitude d’améliorer mes scripts par petits à coups au fil des jours/mois/années…

                    Utilisation : faire une sauvegarde.

                    Utilisation_bis : faire une sauvegarde.

                    Ensuite on peut faire en root

                    zram-cache start list
                    
                    

                    list doit être une liste de répertoires, il faut impérativement qu’il y ait le chemin complet, pas de '.', de '..', ni de '~', sinon je ne sais pas comment le script va se comporter.

                    Puis faire régulièrement un

                    zram-cache sync
                    
                    

                    pour sauvegarder les changements en Zram sur le disque.

                    J’ai commenté l’action stop (qui n’est qu’un sync avec 2/3 commandes supplémentaires) parce que ça déconne si des programmes utilisent toujours des fichiers dans les points de montage. Ce qui veut dire qu’il faut redémarrer l’ordi. (et supprimer /tmp/zram.dat) pour le désactiver. On peut ajouter d’autres répertoires après le start initial grâce à add qui s’utilise comme start. Attention toutefois à ne pas ajouter un répertoire déjà présent en Zram et à veiller à avoir l’espace suffisant dans la Zram, en cas de mauvaise manip. le comportement sera indéterminé… et très probablement très plantogène.

                    zram-cache, WTFPL, il faut régler la variable ramsize :

                    #!/bin/sh
                    
                    # 2^32 = 4294967296 = 4 Go
                    # 2^31 = 2147483648 = 2 Go
                    # 2^30 = 1073741824 = 1 Go
                    # 2^29 =  536870912 =  .5 Go
                    ramsize=2147483648
                    
                    # start/sync/add
                    action=$1
                    shift
                    
                    case "$action" in
                      add)
                        if [ ! -f /tmp/zram.dat ]
                        then
                          echo '/tmp/zram.dat not found, exit'
                          exit 1
                        fi
                        for dir in $*
                        do
                          if [ -d $dir ]
                          then
                            echo $dir>>/tmp/zram.dat
                            mkdir -p `dirname /mnt/zram/$dir`
                            cp -ar $dir /mnt/zram/$dir
                            mount -B /mnt/zram/$dir $dir
                          fi
                        done
                        ;;
                      start)
                        if [ -f /tmp/zram.dat ]
                        then 
                          echo '/tmp/zram.dat found, exit'
                          exit 1
                        fi
                        modprobe zram
                        [ -d /mnt/zram ] || mkdir /mnt/zram
                        echo $ramsize > /sys/block/zram0/disksize
                        mkfs.ext2 -m0 /dev/zram0 > /dev/null
                        mount -t ext2 /dev/zram0 /mnt/zram
                        echo -n '' > /tmp/zram.dat
                        for dir in $*
                        do
                          if [ -d $dir ]
                          then 
                            echo $dir>>/tmp/zram.dat
                            mkdir -p `dirname /mnt/zram/$dir`
                            cp -ar $dir /mnt/zram/$dir
                            mount -B /mnt/zram/$dir $dir
                          fi
                        done
                        ;;
                      sync)
                    #  stop)
                        tmpdir=`mktemp -dp /mnt/zram`
                        for dir in `cat /tmp/zram.dat`
                        do
                          mount -B `dirname $dir`/ $tmpdir
                          rsync -r --delete /mnt/zram/$dir $tmpdir
                          umount $tmpdir
                    #      umount $dir
                        done
                        rm -r $tmpdir
                    #    umount /mnt/zram
                    #    rmmod zram
                        ;;
                      *)
                        echo "Usage: in2zram (start|sync)"
                        exit 1
                        ;;
                    esac
                    
                    exit 0
                    
                    

                    Pour l’instant je ne sais pas moi-même ce que je vais mettre en Zram…

                    • [^] # Re: tmpfs

                      Posté par . Évalué à  2 .

                      Je viens de croiser ceci : http://www.webupd8.org/2011/10/increased-performance-in-linux-with.html
                      Voici le script adapté pour archlinux (https://aur.archlinux.org/packages.php?ID=52958) je ne sais pas si ça te sera utile mais je copie ici.

                      #!/bin/bash
                      
                      . /etc/rc.conf
                      . /etc/rc.d/functions
                      
                      # get the number of CPUs
                      num_cpus=$(grep -c processor /proc/cpuinfo)
                      # if something goes wrong, assume we have 1
                      [[ "$num_cpus" != 0 ]] || num_cpus=1
                      
                      # set decremented number of CPUs
                      decr_num_cpus=$((num_cpus - 1))
                      
                      case "$1" in
                        start)
                          stat_busy "Enabling zram-based swap"
                          # get the amount of memory in the machine
                          mem_total_kb=$(grep MemTotal /proc/meminfo | grep -E --only-matching '[[:digit:]]+')
                          mem_total=$((mem_total_kb * 1024))
                      
                          # load dependency modules
                          modprobe zram num_devices=$num_cpus
                      
                          # initialize the devices
                          for i in $(seq 0 $decr_num_cpus); do
                            echo $((mem_total / num_cpus)) > /sys/block/zram$i/disksize
                          done
                      
                          # Creating swap filesystems
                          for i in $(seq 0 $decr_num_cpus); do
                            mkswap /dev/zram$i
                          done
                      
                          # Switch the swaps on
                          for i in $(seq 0 $decr_num_cpus); do
                            swapon -p 100 /dev/zram$i
                          done
                      
                          stat_done
                        ;;
                        stop)
                          stat_busy "Switching off zram-based swap"
                          # Switching off swap
                          for i in $(seq 0 $decr_num_cpus); do
                            if [[ "$(grep /dev/zram$i /proc/swaps)" != "" ]]; then
                              swapoff /dev/zram$i
                            fi
                          done
                      
                          rmmod zram
                          stat_done
                        ;;
                        *)
                            echo "usage: $0 {start|stop}"
                      esac
                      
                      exit 0
                      
                      
    • [^] # Re: tmpfs

      Posté par (page perso) . Évalué à  2 .

      Pas testé, mais je compte le faire, vu que j'utilise pas mal tmpfs. Comme tmpfs est capable de passer en swap, il suffit d'avoir un ramzswap et ça passera dessus au besoin.

      DLFP >> PCInpact > Numerama >> LinuxFr.org

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.