tmpfs, cas d’usage

This post is also available in: Anglais

Intro

tmpfs est un système de fichier en RAM dispo sur pas mal d’*nix-like (OpenBSD, FreeBSD, GNU/Linux, Solaris, pour ceux que j’ai touché) (vu que sous *BSD ça s’appelle md mais j’ai la flemme, je dirai tout le temps tmpfs, na 🙂 ).

Vous allez me demander à quoi ça sert… Sachez que la RAM est 1 million de fois plus rapide qu’un disque dur : les accès sur la première sont de l’ordre de la nanoseconde, et sur les seconds de l’ordre de la dizaine de millisecondes. Ok : les mécanismes de cache du disque dur font que les accès sont bien plus rapide mais ils sont loin d’égaler ceux de la RAM.

So what ? Sans aller jusqu’à un rapport 1000, les accès aux fichiers dans un tmpfs sont 10 à 50x plus rapide, et son purement électronique : pas de mécanique à faire tourner. Vous voyez les bénéfices ?

Mais il y a une grosse contrepartie : vos fichiers écrits sur un tmpfs disparaissent quand vous éteignez l’ordi (ce qui a aussi un avantage : la sécurité).

Et une petite contrepartie : ça utilise la RAM, mais pas plus que nécessaire : si vous montez un tmpfs de 512Mio, ça prendra en mémoire seulement la taille des fichiers écrits sur le tmpfs, et pas 512Mio.

Voici quelques commandes pour l’utiliser.

Les commandes

*nix

Comme tout système de fichier, tmpfs se monte avec la commande mount(8).

Comme dit plus haut, par défaut la taille de la partition ainsi montée est de la moitié de la RAM. Il est possible de changer cette option :

mount -o size=1G -t tmpfs monTmpfs /un/chemin

Hop, vous avez un tmpfs de 1Gio. Une astuce : ‘monTmpfs’ apparaîtra quand vous ferez mount(8) (sans options)

Juste une chose : la taille ne devrait pas être supérieur à RAM+Swap car si vous remplissez le tmpfs, vous remplirez aussi la RAM et le swap. Je vous laisse imaginer les conséquences.

Et si votre tmpfs est trop petit et qu’il y a plein de choses dedans que vous n’avez pas envie de perdre dans l’immédiat (disons une compilation en cours) ?

mount -o size=2G,remount /un/chemin

Hop, votre tmpfs est passé à 2Gio.

*bsd

C’est un poil différent. Ca s’appelle md : memory disk, et c’est un tantinet plus complet que sous Linux (notamment possibilité sous FreeBSD de l’adosser à 4 systèmes, dont la RAM pour faire comme sous Linux, ou un fichier).

Les commandes sont en gros identiques :

FreeBSD : mdmfs -s <taille> md /un/chemin

Notez que vous devez spécifier la taille.

(jetez un œil à mdconfig, aussi)

OpenBSD : mount_mfs -s <taille> swap /un/chemin

Apparemment, pas de possibilité de redimensionner un md.

Une autre différence entre celui de FreeBSD et celui d’OpenBSD : celui d’OpenBSD permet de peupler le md nouvellement créé avec le contenu d’un fichier .tar (ou cpio) alors que FreeBSD ne semple pas pouvoir. Ca sert à quoi ? Essayez de mettre votre /var/log en tmpfs ou md et vous verrez le problème : syslogd s’attend à avoir une arborescence toute belle, ce qui, bien sûr, ne se fait pas en 2s avec tmpfs et le md de FreeBSD.

Alors, ça peut servir à quoi tout ça ?

Sachez déjà que les tmpfs sont dispo de base sur les OS cités ci-dessus (et monté par défaut dans /dev/shm sous GNU/Linux). Quoi en faire ?

Sa rapidité et sa volatilité peuvent être des avantages, je vous cite 3 cas dans lesquels je l’utilise.

Utilisations

Du cache

tmpfs est rapide, tmpfs disparaît au redémarrage, et un système de fichier tmpfs a une taille limitée (fixée au montage, par défaut de la moitié de la RAM disponible, et modifiable à la volée ; j’en remet une couche mais évitez de le mettre à une taille supérieur à RAM + swap, sinon vous aurez de sérieux problème si le tmpfs est plein ! ), tmpfs peut donc servir de répertoire où stocker du cache.

Au hasard :

  • Cache de Firefox
  • Cache de pulseaudio
  • Cache de Smarty
  • Quelques fichiers temporaires

Bref, stocker des fichiers dont la durée de vie ne dépasse pas celle entre deux redémarrages (il est idiot d’y mettre celle de Squid, pour le coup)

Mais faites attention à limiter la taille du cache si c’est possible : si vous utilisez tmpfs pour le cache de Firefox, baisser la taille de son cache, qui est à 50 Mo par défaut. D’une part pour ne pas prendre jusqu’à 50 Mo de RAM, et d’autre part parce que 50 Mo de cache est un peu trop …

Compiler

tmpfs est rapide, tmpfs peut être assez gros, tmpfs peut donc servir de répertoire de compilation.

Sur Gentoo et FreeBSD, j’ai mis par défaut que ça compile dans un tmpfs. Faites un teste :

  • Créez un bon millier de fichier dans /tmp/plop
  • Faites de même dans /dev/shm/plop
  • Mesurez le temps pour effacer ces fichiers dans l’un et dans l’autre. Sur tmpfs j’obtiens 0.013 ms, sur le système de fichier normal (reiserfs) 0.056 ms

Sous Gentoo l’utilitaire genlop permet de voir le temps qu’a mis une compilation. J’ai fait un test en compilant bash, j’ai gagné 4s sur les 2m20 que prends la compilation. Pas énorme mais m’est avis que le gain n’est pas linéaire et devrait augmenter avec la taille de logiciel compilé.

Et cerise sur le gâteau : du coup ça ne prend virtuellement pas de place sur le système de fichier, et ça ne stress pas le disque dur, qui voit sa durée de vie rallongée d’autant.

Du coup …

Eviter des accès disque

tmpfs est en ram, donc tmpfs n’écrit pas sur le disque, d’où un gain de perf dans le cas ci dessus.

Mais encore ? Dans quel cas est-il assez intéressant d’éviter les accès disque ? Oui, si son disque dur est une carte Compact Flash (comment ça ça ne vous est jamais arrivé ?? ), comme sur, disons, le firewall d’Arnaud et le miens : gains en conso de courant, gain en bruit, perte en perf d’accès disque (mais on s’en fout parce qu’on se connecte rarement sur un firewall, n’est-ce pas ? ), et problème que les cellules des cartes Compact Flash n’ont qu’un nombre limité de cycle lecture/écriture au delà duquel elles ne sont plus accessible.

L’idée, là, est de monter, quand c’est possible, tmpfs dans un maximum de répertoire, et surtout dans ceux que le système écrit régulièrement.

Mon firewall étant sur OpenBSD, j’ai surtout mis ça en place sur cet OS. Voici les répertoire que j’ai mis en tmpfs :

  • /var/log : hé oui ! et du coup les logs systèmes sont aussi envoyés par le réseau à un autre serveur. Dans ce cas, penser à bien tuner la rotation de log pour ne pas saturer le tmpfs, et à utiliser un squelette au moment du montage afin de créer la bonne arborescence.
  • /var/run : pas grand mérite, c’est fait de base sur tous les GNU/Linux ; je l’ai donc configuré de la même manière sur OpenBSD
  • /var/tmp : répertoire temporaire. /tmp n’est plus qu’un lien vers ce répertoire 😉
  • /usr/obj : répertoire où est compilé le système. Il y a sans doutes des problèmes de place, dans ce cas (compiler le système en prend beaucoup) et j’avoue ne pas avoir poussé les tests.

Conclusion

Pas trop cher à mettre en oeuvre, tmpfs est bon pour la sécurité, les perfs, et la planète 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.