Présentation
Cet article à pour objectif de vous faire découvrir ce qu’est un RAMFS.
Nous allons dans un premier temps voir en quoi cela consiste, voir quand il est utile d’utiliser ce genre de mécanisme pour enfin aborder sa mise en place sur un système GNU/Linux.
Un RAMFS, késako ?
C’est tout simplement utiliser la mémoire vive d’un ordinateur en tant que système de fichiers ordinaire. Vous pouvez vous promener dedans, créer des dossiers, des fichiers, etc.. La seule vraie différence avec un système de fichiers classique est la vitesse de transfert : la RAM est beaucoup plus rapide [1] qu’un disque dur classique.
Même si votre ordinateur possède seulement 1 Go de RAM, cette mémoire peut être mieux exploitée en utilisant par exemple 64 Mo de celle-ci pour se fabriquer un petit système de fichiers rapide mais néanmoins temporaire, car le contenu sera effacé à chaque redémarrage.
Utilisations
Il est souvent admis que la vitesse à laquelle progresse un ordinateur est extrêmement liée à la cadence de son processeur. Cependant, ce n’est pas le seul facteur et la vitesse des accès disques est déterminante dans le cas de certaines opérations.
Afin d’accélérer des tâches répétitives qui produisent beaucoup de fichiers intermédiaires, il devient donc pertinent d’utiliser la mémoire vive de l’ordinateur pour profiter de sa vitesse de transfert.
Voici quelques exemples concrets :
- Compilation d’une application au cours de laquelle on ne souhaite pas garder les fichiers intermédiaires en .o (c’est le cas dès que vous utilisez AUR sous Archlinux pour compiler puis installer un logiciel).
- Création de plein de fichiers qui sont faciles à générer et pas important de se souvenir pour chaque session (par exemple une documentation que l’on peut générer rapidement à partir du code source, ou alors les pages HTML de ce site qui sont générées à chaque modification des fichiers Markdown qui le composent).
Deux types disponibles sous GNU/Linux
Votre distribution ne vous propose pas un mais deux types de systèmes de fichiers montés dans la mémoire vive :
- Le RAMFS : c’est le plus simple des deux. Il suffit de le monter sans aucun argument et il adaptera automatiquement sa taille en fonction de son contenu. Attention néanmoins car si vous créez de gros fichiers dedans alors il s’agrandira et cela peut provoquer un disfonctionnement du système en cas de manque de mémoire vive disponible.
- Le TMPFS : contrairement à son homologue, celui-ci possède une taille fixe. On sera alors assurés de l’affichage d’un message d’erreur en cas de tentative d’écriture de fichiers trop gros et on évitera ainsi la saturation de la mémoire vive.
Mise en place
Nous allons voir comment mettre en place un système de fichiers dans la mémoire vive en utilisant les deux outils disponibles concernant le montage de systèmes de fichier sous GNU/Linux : la commande mount et le fichier /etc/fstab.
Méthode temporaire avec mount
Comme avec tout appel classique à mount, il ne faut pas oublier de créer à l’avance le dossier qui servira de point de montage.
Voici un exemple permettant de créer un TMPFS de 64 Mo dans votre dossier personnel, dans le chemin ~/ramfs :
$ mkdir -p ~/ramfs $ sudo mount -t tmpfs -o size=64m tmpfs ~/ramfs
Pour le RAMFS l’appel à mount est plus simple car il n’est pas nécessaire de spécifier la taille maximale pour ce système de fichiers :
$ sudo mount -t ramfs ramfs ~/ramfs
Et c’est tout, l’espace disponible s’adaptera automatiquement à ce qu’il y a dedans (mais attention à ne pas trop le remplir sous peine de surprises).
Méthode permanente avec fstab
Si vous voulez avoir ce point de montage dans votre dossier personnel à chaque démarrage de votre machine, il vous suffit de rajouter une petite ligne dans le fichier /etc/fstab. C’est en effet ce fichier qui va se charger de monter tous les systèmes de fichiers nécessaires à chaque démarrage de la machine.
Voici deux exemples de ligne à rajouter dans le fstab selon le type que vous avez choisi d’utiliser :
# Utilisation d’un TMPFS à taille fixe tmpfs /home/microjoe/ramfs tmpfs nodev,nosuid,size=64M 0 0 # Utilisation d’un RAMFS à taille automatique tmpfs /home/microjoe/ramfs ramfs nodev,nosuid 0 0
Redémarrez votre machine pour vérifier le bon déroulement de l’opération.
Petit benchmark avec dd
Je me suis amusé à faire quelques benchmarks, pas réalisés dans les règles de l’art (pas d’appel à sync) mais qui permet de se donner une idée du gain apporté par cette solution technique.
Voici les résultats au niveau du TMPFS précédemment créé :
$ dd if=/dev/zero of=/home/microjoe/ramfs/out bs=1M count=60 60+0 enregistrements lus 60+0 enregistrements écrits 62914560 octets (63 MB) copiés, 0,120453 s, 522 MB/s
La vitesse est environ 5x plus élevée que celle d’un disque dur 7200 tr/min classique qui atteignent habituellement des vitesses d’écriture de l’ordre de 100 Mb/s.
Vérifions cette assertion en calculant la vitesse d’écriture du disque dur interne :
$ dd if=/dev/zero of=/home/microjoe/out bs=1M count=500 500+0 enregistrements lus 500+0 enregistrements écrits 524288000 octets (524 MB) copiés, 7,423 s, 70,6 MB/s
On est obligé d’utiliser une taille plus grande que 60 Mo car sinon on va taper dans la mémoire cache du disque qui sera plus rapide que sa vraie vitesse de transfert (quelque chose comme 300 MB/s au lieu de 70 MB/s).
Conclusion
Vous avez désormais toutes les clés en main pour accélérer la vitesse d’exécution de certaines opérations gourmandes en I/O !
Si vous souhaitez aller plus loin (je ne l’ai pas détaillé dans cet article car je suis en train d’essayer de mettre ça au point de mon côté), vous pouvez envisager de créer des liens symboliques pour des dossiers dans votre arborescence personnelle vers des dossiers de votre RAMFS (créés à chaque démarrage) afin d’avoir automatiquement la création de certains fichiers couteux directement en RAM sans jamais avoir à y faire trop attention !
Par exemple, pour Hakyll on peut créer des liens symboliques pour les dossiers _site et _cache que l’on héberge dans la RAMFS plutôt que sur le disque étant donné que ça provoque pas mal d’I/O et que c’est facile à regénérer :
$ mkdir -p ~/ramfs/{_site,_cache} $ ln -s ~/ramfs/_site . && ln -s ~/ramfs/_cache .
Par contre je n’ai pas encore réussi à appliquer ce principe pour le dossier de construction de CMake à cause de l’utilisation des chemins relatifs qui viennent compliquer la tâche.
Pour plus d’informations : /ramfs et /tmpfs dans man mount.
[1] | Le ratio dépend de l’architecture du PC, car la RAM peut aller de 200 à 500 Mo/s en fonction de la technologie utilisée d’après le peu de tests que j’ai pu faire, ce qui donne un ratio de 2x à 5x par rapport à un disque 7200 tr/min à 100 Mo/s. |