101 votes

Mise en cache/préchargement de fichiers sur Linux dans la RAM

J'ai un serveur plutôt vieux qui a 4 Go de RAM et qui sert essentiellement les mêmes fichiers toute la journée, mais il le fait à partir du disque dur alors que 3 Go de RAM sont "libres".

Toute personne ayant déjà essayé d'exécuter un disque RAM peut témoigner que c'est génial en termes de vitesse. L'utilisation de mémoire de ce système n'est généralement jamais supérieure à 1 Go/4 Go, donc je veux savoir s'il y a un moyen d'utiliser cette mémoire supplémentaire pour quelque chose de bon.

  • Est-il possible de demander au système de fichiers de toujours servir certains fichiers à partir de la RAM?
  • Existe-t-il d'autres méthodes que je peux utiliser pour améliorer les capacités de lecture de fichiers en utilisant la RAM?

Plus spécifiquement, je ne cherche pas un 'hack' ici. Je veux que les appels au système de fichiers servent les fichiers à partir de la RAM sans avoir besoin de créer un disque RAM et de copier les fichiers manuellement. Ou du moins un script qui le fait pour moi.

Les applications possibles ici sont :

  • Serveurs Web avec des fichiers statiques qui sont souvent lus.
  • Serveurs d'application avec de grandes bibliothèques.
  • Ordinateurs de bureau avec trop de RAM.

Des idées?

Édition :

  • Très informatif : La cache Linux et pdflush
  • Comme l'a souligné Zan, la mémoire n'est pas vraiment libre. Ce que je veux dire, c'est qu'elle n'est pas utilisée par les applications et je veux contrôler ce qui doit être mis en cache en mémoire.

1 votes

Je cherche également quelque chose dans ce sens. Je ne pense pas que la mise en cache générale des blocs de disque du système de fichiers soit la réponse. Supposons que je veuille que le bloc de disque X soit toujours mis en cache. Quelque chose y accède, et le noyau le met en cache. Jusque-là tout va bien, mais le processus suivant veut le bloc Y, donc le noyau abandonne mon bloc X et met en cache Y à la place. Le prochain processus qui veut X devra attendre qu'il soit retiré du disque; c'est ce que je veux éviter. Ce que je voudrais (et ce que je pense que le message original cherche aussi) est de superposer un cache à écriture automatique sur un système de fichiers qui garantira que les fichiers sont toujours

2 votes

Étant donné que le consensus semble être que Linux devrait déjà mettre en cache les fichiers fréquemment utilisés pour vous, je me demande si vous avez effectivement réussi à apporter des améliorations en suivant les conseils trouvés ici. Il me semble que tenter de contrôler manuellement le cache pourrait être utile pour chauffer le cache, mais qu'avec le schéma d'utilisation que vous décrivez ("servir les mêmes fichiers toute la journée"), cela ne serait pas d'une grande aide pour un serveur déjà chauffé, ou pas du tout.

0 votes

Vous dites que vous ne cherchez pas un hack, mais Linux fait déjà ce que vous voulez faire par défaut. L'équation suivante : "servir les mêmes fichiers toute la journée" + "dire au système de fichiers de toujours servir certains fichiers depuis la RAM" équivaut à un "hack" par définition. Avez-vous réellement remarqué des améliorations de performances ? D'après mon expérience, Linux met en cache vos lectures du système de fichiers.

80voto

Patrick Points 3083

vmtouch semble être un bon outil pour le travail.

Points forts :

  • interroger combien d'un répertoire est mis en cache
  • interroger combien d'un fichier est mis en cache (ainsi que les pages, représentation graphique)
  • charger un fichier dans le cache
  • supprimer un fichier du cache
  • verrouiller les fichiers dans le cache
  • exécuter en tant que daemon

manuel de vmtouch

ÉDITER : Utilisation comme demandé dans la question est répertoriée dans l'exemple 5 sur la page d'accueil de vmtouch

Exemple 5

Démonisez et verrouillez tous les fichiers d'un répertoire en mémoire physique :

vmtouch -dl /var/www/htdocs/critical/

ÉDITER2: Comme remarqué dans les commentaires, il existe maintenant un dépôt git disponible.

6 votes

Pour les futurs spectateurs, essayez d'utiliser le référentiel Git vmtouch au lieu de suivre les instructions sur la page liée. De cette façon, vous obtenez un makefile et pouvez tirer des mises à jour.

0 votes

Il semble qu'il y ait une limite à la taille du fichier (4 Go). Y a-t-il une autre alternative ?

0 votes

D'accord, voici mon cas d'utilisation actuel : un RPi1 avec une vieille carte SD, quelque part en train de faire des choses. Avant que je puisse y aller remplacer la carte (et éventuellement l'alimentation), je veux que le système d'exploitation touche la carte le moins possible, de préférence jamais. Le cache FS est bon mais hors de mon contrôle ; /bin et /sbin sont déjà sur tmpfs, mettre /home/user de la même manière a d'autres inconvénients. vmtouch correspond bien à cette niche.

33voto

ewwhite Points 193555

C'est également possible en utilisant l'utilitaire vmtouch Virtual Memory Toucher.

Cet outil vous permet de contrôler le cache du système de fichiers sur un système Linux. Vous pouvez forcer ou verrouiller un fichier ou répertoire spécifique dans le sous-système cache VM, ou l'utiliser pour vérifier quelles parties d'un fichier/dossier sont contenues dans VM.

Combien de fichiers du répertoire /bin/ sont actuellement en cache?

$ vmtouch /bin/
           Fichiers: 92
     Répertoires: 1
  Pages Résidentes: 348/1307  1M/5M  26.6%
         Écoulé: 0.003426 secondes

Ou...

Prenons le reste de big-dataset.txt en mémoire...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

4 votes

Il s'agit d'un excellent outil qui fait exactement ce que l'OP a demandé. Si seulement il acceptait cela comme réponse.

0 votes

Savez-vous si cela fonctionne avec ZFS ?

1 votes

@CMCDragonkai Je ne pense pas que ce soit nécessaire avec ZFS... Pensez à : ARC and L2ARC.

26voto

cagenut Points 4828

Une astuce de pauvre pour mettre des éléments dans le cache du système de fichiers est simplement de les afficher avec la command "cat" et de rediriger cela vers /dev/null.

Voici un exemple :-

cat /chemin/monfichier.db > /dev/null

1 votes

D'accord. Et si vous voulez vous assurer que certains fichiers sont mis en cache, créez un travail cron qui cat le fichier vers /dev/null périodiquement

0 votes

Cronjob est une certaine gêne, mais pourriez-vous commenter s'il y a un désavantage à utiliser cat file (par rapport à vmtouch -vt file) pour charger un fichier dans le tampon de disque?

1 votes

@user1079505 L'inconvénient est que si des parties du fichier sont manquantes dans la RAM, elles seront lues à nouveau depuis le disque. Si vous utilisez vmtouch -t, elles sont verrouillées dans la RAM et il n'est plus nécessaire de les relire. Vous vous demandez peut-être pourquoi elles ont été perdues. Cela arrive car d'autres fichiers sont lus depuis le disque et mis en cache également. Si les fichiers mis en cache sont souvent lus, ils resteront dans la RAM mais si vous lisez un fichier énorme qui est plus grand que votre RAM, il écrasera complètement le cache (sauf si vous avez verrouillé les fichiers avec vmtouch). Plus d'infos: unix.stackexchange.com/a/539180/101920

23voto

David Pashley Points 22851

Linux mettra en cache autant d'E / S disque en mémoire qu'il le peut. C'est ce que sont les statistiques de mémoire cache et tampon. Il fera probablement un meilleur travail que vous pour stocker les bonnes choses.

Cependant, si vous insistez pour stocker vos données en mémoire, vous pouvez créer un lecteur RAM en utilisant soit tmpfs soit ramfs. La différence est que ramfs allouera toute la mémoire que vous demandez, tandis que tmpfs n'utilisera que la mémoire utilisée par votre périphérique de bloc. Ma mémoire est un peu rouillée, mais vous devriez être capable de faire :

 # mount -t ramfs ram /mnt/ram 

ou

 # mount -t tmpfs tmp /mnt/tmp

et ensuite copiez vos données dans le répertoire. Évidemment, lorsque vous éteignez la machine ou démontez cette partition, vos données seront perdues.

1 votes

Merci pour votre réponse, mais c'est clairement ce que je veux éviter. Sinon, je n'aurais qu'à écrire un script pour que l'ordinateur crée le ramdrive, copie les fichiers et crée des liens symboliques vers le ramdrive. Mais alors mes données seraient incohérentes. J'espérais trouver un système de fichiers où je pourrais 'taguer' certains fichiers pour qu'ils soient mis en cache en mémoire. Mais peut-être que je suis un peu trop optimiste.

3 votes

Vous "tag" les fichiers pour qu'ils soient mis en cache en y accédant.

13 votes

S'il y avait seulement un moyen de taguer automatiquement les fichiers les plus couramment utilisés.

18voto

lurks Points 1179

Après avoir fait une lecture approfondie sur les fonctionnalités de swapping et de mise en cache de pages du noyau 2.6, j'ai trouvé 'fcoretools'. Qui se compose de deux outils;

  • fincore: Révélera combien de pages l'application a stockées en mémoire centrale
  • fadvise: Vous permet de manipuler la mémoire centrale (cache de pages).

(Au cas où quelqu'un d'autre trouverait cela intéressant, je le poste ici)

1 votes

J'ai pensé qu'il y avait un programme quelque part pour le faire. +1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X