web-dev-qa-db-fra.com

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

J'ai un serveur assez ancien qui a 4 Go de RAM et il sert à peu près les mêmes fichiers toute la journée, mais il le fait à partir du disque dur tandis que 3 Go de RAM sont "gratuits".

Quiconque a déjà essayé de faire fonctionner un lecteur RAM peut constater que c'est génial en termes de vitesse. L'utilisation de la mémoire de ce système n'est généralement jamais supérieure à 1 Go/4 Go, donc je veux savoir s'il existe un moyen d'utiliser cette mémoire supplémentaire pour quelque chose de bien.

  • Est-il possible de dire au système de fichiers de toujours servir certains fichiers hors de la RAM?
  • Y a-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 précisément, je ne cherche pas un "hack" ici. Je veux que les appels du système de fichiers servent les fichiers de RAM sans avoir besoin de créer un lecteur RAM et de copier les fichiers manuellement. Ou au 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'applications avec de grandes bibliothèques
  • Ordinateurs de bureau avec trop de RAM

Des idées?

Éditer:

  • J'ai trouvé cela très informatif: Le cache de page Linux et pdflush
  • Comme l'a souligné Zan, la mémoire n'est pas réellement libre. Ce que je veux dire, c'est qu'il n'est pas utilisé par les applications et je veux contrôler ce qui doit être mis en cache en mémoire.
76
Andrioid

vmtouch semble être un bon outil pour le travail.

Points forts:

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

manuel vmtouch

EDIT: L'utilisation comme demandé dans la question est répertoriée dans l'exemple 5 sur vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

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

EDIT2: Comme noté dans les commentaires, il y a maintenant un dépôt git disponible.

60
seeker

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

L'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 un répertoire spécifique dans le sous-système de cache VM, ou l'utiliser pour vérifier quelles parties d'un fichier/répertoire sont contenues dans la VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Ou...

Let's bring the rest of big-dataset.txt into memory...

$ 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
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds
26
ewwhite

L'astuce d'un pauvre homme pour mettre des trucs dans le cache du système de fichiers est de simplement les récupérer et de les rediriger vers/dev/null.

23
cagenut

Linux mettra en cache autant de disque IO en mémoire que possible. C'est ce que sont les statistiques de la mémoire cache et du tampon. Il fera probablement un meilleur travail que vous ne le ferez pour stocker les bonnes choses.

Cependant, si vous insistez pour stocker vos données en mémoire, vous pouvez créer un lecteur RAM à l'aide de tmpfs ou de ramfs. La différence est que ramfs allouera toute la mémoire que vous demandez, car tmpfs n'utilisera que la mémoire que votre périphérique de bloc utilise. Ma mémoire est un peu rouillée, mais vous devriez pouvoir faire:

 # mount -t ramfs ram /mnt/ram 

ou

 # mount -t tmpfs tmp /mnt/tmp

puis copiez vos données dans le répertoire. De toute évidence, lorsque vous éteignez la machine ou démontez cette partition, vos données seront perdues.

18
David Pashley

Après quelques lectures approfondies sur les fonctionnalités d'échange de noyau 2.6 et de mise en cache des pages, j'ai trouvé "fcoretools". Qui se compose de deux outils;

  • fincore: révélera le nombre de pages que l'application a stockées dans la mémoire centrale
  • fadvise: permet de manipuler la mémoire centrale (page-cache).

(Si quelqu'un d'autre trouve cela intéressant, je le poste ici)

18
Andrioid

Il existe deux paramètres du noyau qui peuvent considérablement aider même sans utiliser d'autres outils:

swappiness

indique au noyau linux à quel point il doit utiliser swap. Citant l'article Wikipedia:

Swappiness est une propriété du noyau Linux qui modifie l'équilibre entre l'échange de mémoire d'exécution, par opposition à la suppression de pages du cache de pages système. La permutation peut être définie sur des valeurs comprises entre 0 et 100 inclus. Une valeur faible signifie que le noyau essaiera d'éviter autant que possible l'échange, alors qu'une valeur plus élevée obligera le noyau à essayer agressivement d'utiliser l'espace d'échange. La valeur par défaut est 60, et pour la plupart des systèmes de bureau, le définir sur 100 peut affecter les performances globales, tandis que le définir sur une valeur inférieure (même 0) peut améliorer l'interactivité (diminution de la latence de la réponse).

vfs_cache_pressure

Citant de vm.txt :

Contrôle la tendance du noyau à récupérer la mémoire utilisée pour la mise en cache des répertoires et des objets inode.

À la valeur par défaut de vfs_cache_pressure = 100, le noyau tentera de récupérer les dentiers et les inodes à un taux "équitable" par rapport à la récupération de pagecache et de swapcache. La diminution de vfs_cache_pressure fait que le noyau préfère conserver les caches dentry et inode. ...


En définissant swappiness élevé (comme 100), le noyau déplace tout ce dont il n'a pas besoin pour échanger, libérant RAM pour la mise en cache des fichiers. Et en définissant vfs_cache_pressure inférieur (disons à 50, pas à 0!), il favorisera la mise en cache des fichiers au lieu de conserver les données d'application en RAM.

(Je travaille sur un grand projet Java et chaque fois que je l'exécute, il a fallu beaucoup de RAM et vidé le cache disque, donc la prochaine fois que je compilé le projet tout a été lu à nouveau sur le disque. En ajustant ces deux paramètres, je parviens à garder les sources et les sorties compilées en cache dans la RAM, ce qui accélère considérablement le processus.)

7
Petr Pudlák

Je doute fort qu'il serve réellement des fichiers à partir du disque avec 3 Go RAM gratuit. La mise en cache des fichiers Linux est très bonne.

Si vous voyez des E/S sur disque, j'examinerais vos configurations de journalisation. De nombreux journaux sont définis comme étant sans tampon, afin de garantir que les dernières informations de journal sont disponibles en cas de plantage. Dans les systèmes qui doivent être rapides malgré tout, utilisez un journal tamponné IO ou utilisez un serveur de journaux distant.

3
Zan Lynx

Vous pourrez peut-être avoir un programme qui ne fait que mmap s vos fichiers, puis reste en cours d'exécution.

3
Brad Gilbert

Si vous avez beaucoup de mémoire, vous pouvez simplement lire les fichiers que vous souhaitez mettre en cache avec cat ou similaire. Linux fera alors un bon travail pour le garder.

3

http://www.coker.com.au/memlockd/ fait cela

bien que vous n'en ayez vraiment pas besoin, linux fera un très bon travail de mise en cache des fichiers que vous utilisez seul.

0
Justin

Il existe différents systèmes ramfs que vous pouvez utiliser (par exemple, ramfs, tmpfs), mais en général, si les fichiers sont réellement lus aussi souvent, ils se trouvent dans le cache de votre système de fichiers. Si votre jeu de fichiers est plus volumineux que votre RAM libre, les fichiers seront supprimés de celui-ci - mais si votre jeu de travail est plus grand que votre RAM libre, il n'y a aucun moyen de tout ranger dans un disque virtuel.

Vérifiez la sortie de la commande "free" dans un shell - la valeur dans la dernière colonne, sous "Cached", est la quantité de votre RAM libre utilisée pour le cache du système de fichiers.

0
Daniel Lawson

Pas exactement ce qui a été demandé, mais j'utilise

trouver BASE_DIRECTORY -type f -exec cat {}>/dev/null \;

pour déclencher l'initialisation des fichiers dans un volume AWS créé à partir d'un instantané. C'est plus ciblé que la recommandation officielle d'utiliser dd si vous voulez simplement lire certains fichiers.

0
Federico

Quant à votre dernière question, assurez-vous que votre RAM se trouve sur différents canaux de mémoire afin que le processeur puisse récupérer les données en parallèle.

0
sybreon

Je pense que cela pourrait être mieux résolu au niveau de l'application. Par exemple, il existe probablement des serveurs Web spécialisés pour cela, ou vous pourriez envisager mod_cache avec Apache. Si vous avez un objectif spécifique, tel que la diffusion plus rapide de contenu Web, vous pouvez obtenir des améliorations de ce genre de chose, je pense.

Mais votre question est de nature générale, le sous-système de mémoire Linux est conçu pour fournir la meilleure utilisation générale de la RAM. Si vous souhaitez cibler certains types de performances, pensez à tout rechercher dans/proc/sys/vm.

Le paquet fcoretools est intéressant, je serais intéressé par des articles sur son application ... Ce lien parle des appels système réels utilisés dans une application.

0
Kyle Brandt

j'ai juste essayé dd if =/dev/yourrootpartition of =/dev/null\bs = 1Mcount = howmuchmemoryyouwanttofill

il ne me donne pas le contrôle que vous désirez mais il essaie au moins d'utiliser la mémoire perdue

0
Bogus Name

Les ordinateurs de bureau (par exemple, ubuntu) utilisent déjà des fichiers de préchargement (au moins, les bibliothèques partagées populaires) dans la mémoire au démarrage. Il est utilisé pour accélérer le temps de démarrage et de démarrage de différents bloarware comme FF, OO, KDE et GNOME (avec evolution bloat-mailer).

L'outil est nommé readahead http://packages.ubuntu.com/dapper/admin/readahead

Il existe également un syscall correspondant: readahead (2)http://linux.die.net/man/2/readahead

Il existe également un projet de préchargement du démon: http://linux.die.net/man/8/preload

0
osgx

j'utilise la chaîne find/-name de caractère aléatoire, cela aide beaucoup

0
user50472