Comment configurer Linux pour mettre en cache les métadonnées des fichiers de préférence au contenu?

14

Je voudrais configurer le système pour utiliser la plupart de la RAM pour la mise en cache des métadonnées du système de fichiers, mais seulement une quantité raisonnablement petite pour la mise en cache en lecture / écriture et la préchargement des fichiers. Idéalement, j'aimerais pouvoir parcourir le système de fichiers (autant qu'il tient dans la RAM) sans faire tourner les disques jusqu'à ce que j'ouvre un fichier.

Voici les détails:

J'ai un serveur de fichiers fait maison. Il a cinq disques dans un volume LVM d'environ 9 To, mais seulement 4 Go de RAM. Comme le serveur ne fait pas grand-chose d'autre que de servir les fichiers, la majeure partie de la RAM est utilisée pour la mise en cache. («Gratuit» signale 3,4 G sur 3,9 G utilisés pour le cache.)

Le serveur habite dans ma chambre, et si tous les disques tournent, il fait suffisamment de bruit pour être ennuyeux quand il est silencieux. (Je ne veux pas dire chercher du bruit, juste du bruit de rotation. Les disques sont de différentes marques et modèles, et je pense que de légères différences de vitesse de rotation provoquent des interférences. Aucun disque n'est bruyant en soi, mais si certains tournent ensemble, il y a un léger bruit avec une période sous-Hertz.) J'ai donc configuré le serveur pour faire tourner les disques la plupart du temps.

Bien sûr, si les disques sont essaimés lorsque j'ouvre un dossier dans mon gestionnaire de fichiers, il y a un délai pendant que l'un des disques a ce dossier tourne. Ce n'est pas grave. Mais selon l'endroit où je regarde, cela peut se produire plusieurs fois de suite, si LVM arrive à répartir les métadonnées de chaque sous-dossier sur les différents disques.

Je soupçonne que Linux remplit principalement son cache avec le contenu des fichiers et peut-être des données prélues. La mise en cache n'est pas très utile au-delà de quelques Mo pour assurer une lecture fluide; si je viens de regarder un film, je ne le reverrai probablement pas de sitôt. La lecture anticipée, si cela se produit, est également complètement inutile dans mon cas , après plus de quelques Mo.

Mais on pourrait penser que 4 Go devraient être suffisants pour pouvoir mettre en cache la plupart des métadonnées du système de fichiers, au moins les parties qui ont déjà été visitées, afin que je puisse parcourir les fichiers sans avoir besoin de faire tourner les disques s'il s'avère qu'ils sont en train de dormir.

Il y aurait toujours un délai lors de l'ouverture du fichier, mais c'est OK. Comparez «cliquez; attendez ; Cliquez sur; attendez ; Cliquez sur; attendez ; jouer; regarder »avec« cliquer; Cliquez sur; Cliquez sur; jouer; attendez ; regarder". Le premier est incroyablement frustrant; ce dernier est presque attendu.

Remarques:

  1. Si cela importe, le noyau est 3.2, le système d'exploitation est Debian, le volume est lvm2 et le FS est ext4.

  2. La seule raison du ralentissement est le bruit pendant la nuit; sinon, le serveur fonctionne en continu. (Je l'ai rendu aussi faible que raisonnable.) Le délai de ralentissement varie en fonction de l'heure de la journée.

  3. Les disques durs sont réservés aux médias. Le système d'exploitation se trouve sur une (petite) clé USB distincte. (Ce qui signifie que tout retard de rotation provient des données, pas seulement parce qu'il avait besoin de quelque chose /usrou quoi que ce soit. Je pourrais épargner quelques Go dessus si cela pouvait aider mon problème d'une manière ou d'une autre.

  4. Un impact raisonnable sur les performances n'est pas un gros problème. Les disques sont de toute façon plus rapides que mon réseau.

bogdanb
la source

Réponses:

10

Pour contrôler la façon dont Linux met en cache les choses, reportez-vous à ce https://www.kernel.org/doc/Documentation/sysctl/vm.txt

En particulier, regardez vfs_cache_pressure, vous voulez probablement une valeur vraiment basse ou peut-être même zéro (1 sonne un peu plus sûr pour moi cependant):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Vous pouvez également souhaiter modifier swappinesspour ne jamais échanger de données ou faire en sorte que cela ne se produise que dans des cas extrêmes.

L' drop_cachesoption peut être pratique pour supprimer explicitement les données que vous ne souhaitez plus mettre en cache.

Je suis sûr qu'il existe probablement d'autres options qui peuvent vous aider, alors consultez la documentation du noyau.

Pour les appliquer, je mettrais les paramètres que vous souhaitez modifier /etc/sysctl.confou tout ce que votre système d'exploitation doit les restaurer au démarrage.

Kyle
la source
3
Bon post, mais vous voudriez autant d'échanges que possible compte tenu de l'objectif du PO. L'échange ne touche que la mémoire de l'utilisateur, ce qui augmente sa tendance à échanger sur le disque, puis laisse plus de mémoire physique aux caches. L'augmentation de la perméabilité libère de la mémoire mais peut ralentir les applications si elle est trop élevée (déterminer le sweet spot est essentiellement une guestimation itérative)
Bratchley
Salut Kyle, merci pour l'idée. vfs_cache_pressure fonctionne en quelque sorte, mais ce n'est pas tout à fait suffisant. Voici ce que j'ai fait:
bogdanb
Lorsque je mets vcp à 0, si je fais un find / -ls > /dev/null, puis ralentis les disques, puis findtous les fichiers à nouveau, les disques ne tournent pas. freemontre des tampons s'élevant à environ 202 Mo lors de cette opération. Mais, si je le findpuis cat /file/bigger/than/ram > /dev/null, puis freemontre la cachedhausse pour remplir l'espace vide, et pour une raison quelconque buffersva à environ 195MB. Ensuite, si je tourne les disques et que je findrecommence, les disques tournent toujours :-(
bogdanb
À propos swappiness: il est défini sur la valeur par défaut de 60, mais la machine n'a pas de partition de swap, donc je ne sais pas si elle fait beaucoup. Je suppose que je pourrais mettre un fichier d'échange sur le lecteur flash, mais je ne sais pas comment cela pourrait aider, ni comment le dimensionner.
bogdanb
1
Linux essaie d'être intelligent sur la mise en cache. Je ne suis pas sûr que la définition de vfs = 0 fonctionnera comme vous l'attendez. Je pense qu'il essaierait de récupérer ces autres entrées lorsque la pression des applications (ie malloc ()) demande plus de mémoire. Quant à un moyen de dire à Linux de ne pas utiliser plus de 2 Go pour les caches, je ne suis pas au courant d'une telle chose. Ce serait gaspiller de la RAM dans la plupart des cas. Une autre chose que vous voudrez peut-être examiner est le "mode ordinateur portable" qui essaie de faire les choses différemment pour limiter les disques pour les ordinateurs portables. Je ne l'ai pas utilisé cependant, donc je n'en sais pas grand-chose.
Kyle