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

74

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

Quiconque a déjà essayé de faire fonctionner un lecteur RAM peut en témoigner. C'est impressionnant 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. Par conséquent, je souhaite savoir s'il existe un moyen d'utiliser cette mémoire supplémentaire à des fins utiles.

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

Plus précisément, je ne cherche pas un «hack» ici. Je veux que les appels de système de fichiers servent les fichiers de la RAM sans avoir à créer un lecteur de disque dur et à y copier les fichiers manuellement. Ou au moins un script qui fait cela pour moi.

Les applications possibles sont:

  • Serveurs Web avec des fichiers statiques lus beaucoup
  • Serveurs d'applications avec de grandes bibliothèques
  • Ordinateurs de bureau avec trop de RAM

Des idées?

Modifier:

  • J'ai trouvé cela très informatif: Le cache de pages 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 dans la mémoire.
Androïde
la source
1
Moi aussi, je cherche quelque chose dans ce sens. Je ne pense pas que la mise en cache de bloc de disque du système de fichiers général soit la solution. 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. Jusqu'ici tout va bien, mais le processus suivant veut le bloc Y, le noyau rejette donc mon bloc X et met Y en cache. Le prochain processus qui veut que X devra attendre qu’il sorte du disque; c'est ce que je veux éviter. Ce que j'aimerais (et ce que je pense que l'affiche originale est également après) est de superposer un cache d'écriture sur un système de fichiers qui garantira que les fichiers sont toujours présents.
1
Étant donné que le consensus semble être que Linux devrait déjà mettre en cache pour vous les fichiers fréquemment utilisés, je me demande si vous avez réellement réussi à apporter des améliorations en utilisant les conseils fournis ici. Il me semble qu'essayer de contrôler manuellement la mise en cache pourrait être utile pour réchauffer le cache, mais qu'avec le modèle d'utilisation que vous décrivez ("servir les mêmes fichiers toute la journée"), cela n'aiderait pas un serveur déjà réchauffé. beaucoup, voire pas du tout.
Nate CK
Vous dites que vous ne recherchez 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" + "indique au système de fichiers de toujours servir certains fichiers en mode RAM" est égal à "pirater" par définition. Avez-vous réellement remarqué des améliorations de performances? D'après mon expérience, le cache Linux est le meilleur des lectures de votre système de fichiers.
Mike S
2
Pour plus de clarté, linux met les fichiers en cache, mais les métadonnées sont validées pour chaque fichier pour chaque demande. En cas de rouille en rotation, sur un serveur Web occupé avec beaucoup de petits fichiers, cela peut toujours provoquer des conflits d'E / S et l'usure prématurée des lecteurs. Le contenu statique et les scripts peuvent être rsync dans / dev / shm ou dans un montage tmpfs personnalisé au démarrage de l'application. Je fais cela depuis quelques décennies et mes disques ne s'usent pas prématurément. De plus, mes sites supportent beaucoup mieux la charge d’éclatement de cette façon. Cela contribue à tout, du matériel d'entreprise le plus cher au matériel commercial.
Aaron

Réponses:

57

vmtouch semble être un bon outil pour ce travail.

Points forts:

  • demande combien de répertoire est mis en cache
  • demande quelle quantité de fichier est mise en cache (également quelles pages, représentation graphique)
  • charger le fichier en cache
  • retirer le fichier du cache
  • verrouiller les fichiers en cache
  • exécuter en tant que démon

vmtouch manuel

EDIT: l' utilisation telle qu'elle est demandée dans la question est répertoriée dans l'exemple 5 de vmtouch Hompage

Example 5

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

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

EDIT2: Comme indiqué dans les commentaires, un référentiel git est maintenant disponible.

chercheur
la source
5
Pour les futurs spectateurs, essayez d’utiliser le référentiel vmtouch git au lieu de suivre les instructions de la page liée. De cette façon, vous obtenez un fichier makefile et pouvez extraire les mises à jour.
aléatoire
On dirait qu'il y a une limite à la taille du fichier (4 Go). Il y a t'il d'autres solutions?
Alix Axel
Ok, voici mon cas d'utilisation actuel: un RPi1 avec une ancienne carte SD, quelque part en train de faire Stuff. Avant de pouvoir y faire un voyage et remplacer la carte (et éventuellement l'alimentation), je souhaite que le système d'exploitation touche la carte avec parcimonie, de préférence jamais. Le cache FS est bon mais hors de mon contrôle; / bin et / sbin sont déjà sur tmpfs, obtenir / home / user présente également d'autres inconvénients. vmtouchcorrespond bien à cette niche.
Piskvor
Comment vmtouch fonctionne-t-il différemment des tmpfs?
Edward Torvalds
26

Ceci est également possible en utilisant la vmtouch Toucher de la mémoire virtuelle utilitaire .

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 de la 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
ewwhite
la source
3
c'est un très bon utilitaire et fait exactement ce que l'OP a demandé. Si seulement il accepterait cela comme une réponse.
laebshade
Savez-vous si cela fonctionne avec ZFS?
CMCDragonkai
1
@CMCDragonkai Je ne pense pas que ce soit nécessaire avec ZFS ... Pensez: ARC et L2ARC .
ewwhite
22

L'astuce du pauvre pour obtenir des éléments dans le cache du système de fichiers consiste simplement à le modifier et à le rediriger vers / dev / null.

cagenut
la source
1
Se mettre d'accord. Et si vous voulez vous assurer que certains fichiers sont mis en cache, créez un travail cron qui cats le fichier vers / dev / null périodiquement
Josh
18

Linux mettra en cache autant d’IO de disque en mémoire que possible. C’est ce que sont les statistiques de cache et de mémoire tampon. Cela fera probablement un meilleur travail que de 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 utilisée par votre périphérique block. 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.

David Pashley
la source
1
Merci pour votre réponse, mais c'est évidemment ce que je veux éviter. Sinon, je créerais un script pour que l’ordinateur crée la clé USB, copie les fichiers et crée un lien symbolique vers la clé. Mais alors mes données sont incohérentes. J'espérais un système de fichiers où je pourrais 'taguer' certains fichiers à mettre en mémoire cache. Mais peut-être que je suis un peu trop optimiste.
Andrioid
3
Vous "balisez" les fichiers à mettre en cache en y accédant.
womble
9
Si seulement il y avait un moyen de marquer automatiquement les fichiers les plus couramment utilisés.
David Pashley
4
Blimey, le sarcasme ne voyage pas bien fait bien :)
David Pashley le
2
Oui merci. Je comprends le concept de cache IO. Je l'ai même expliqué dans ma réponse. On dirait que vous n'avez pas lu le commentaire subtil que c'était du sarcasme.
David Pashley
18

Après quelques lectures approfondies sur les fonctionnalités de permutation de noyau et de mise en cache de noyau 2.6, 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 principale
  • fadvise: vous permet de manipuler la mémoire principale (cache de pages).

(Si quelqu'un trouve ça intéressant, je poste ça ici)

Androïde
la source
1
Je pensais qu'il y avait un programme pour le faire quelque part. +1
Brad Gilbert
7

Deux paramètres du noyau peuvent considérablement aider même sans utiliser d’autres outils:

swappiness

indique au noyau Linux à quel point il doit utiliser swap de manière agressive. Citant l'article de Wikipedia:

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

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 objets annuaire et inode.

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


En réglant swappinesshigh (comme 100), le noyau déplace tout ce qu’il n’a pas besoin d’échanger, libérant ainsi de la RAM pour la mise en cache des fichiers. Et en réglant vfs_cache_pressurelow (disons 50, pas 0!), Cela favorisera la mise en cache des fichiers plutôt que de conserver les données de l'application dans la RAM.

(Je travaille sur un projet Java volumineux et chaque fois que je l’exécutais, cela prenait beaucoup de mémoire vive et effaçait le cache disque. Ainsi, lors de la compilation suivante du projet, tout était à nouveau lu à partir du disque. En ajustant ces deux paramètres, je gère conserver les sources et la sortie compilée en mémoire cache, ce qui accélère considérablement le processus.)

Petr Pudlák
la source
3

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

Si vous voyez des E / S de disque, je consulterais vos configurations de journalisation. De nombreux journaux sont définis comme non tamponnés, afin de garantir que les dernières informations de journal sont disponibles en cas de blocage. Indépendamment des systèmes qui doivent être rapides, utilisez l’entrée d’écriture du journal en mémoire tampon ou un serveur de journal distant.

Zan Lynx
la source
Vous avez raison, je veux juste contrôler ce qui est mis en cache.
Andrioid
3

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 du bon travail pour le garder.

Thorbjørn Ravn Andersen
la source
3

Vous pourrez peut-être avoir un programme qui stocke simplement mmapvos fichiers, puis reste actif.

Brad Gilbert
la source
3
C'est à peu près ce que "fadvise" (fcoretools) fait, autant que je peux dire.
Andrioid
0

Il existe différents systèmes ramfs que vous pouvez utiliser (par exemple, ramfs, tmpfs), mais en général, si les fichiers sont lus souvent, ils se trouvent dans le cache de votre système de fichiers. Si votre ensemble de fichiers de travail est plus volumineux que votre RAM libre, les fichiers en seront effacés - mais si votre ensemble de travail est plus grand que votre RAM libre, vous ne pourrez pas l'intégrer dans un disque mémoire.

Vérifiez le résultat de la commande "free" dans un shell - la valeur de la dernière colonne, sous "Cached", représente la quantité de mémoire RAM utilisée pour le cache du système de fichiers.

Daniel Lawson
la source
0

En ce qui concerne votre dernière question, assurez-vous que votre RAM est installée sur différents canaux de mémoire afin que le processeur puisse extraire les données en parallèle.

sybreon
la source
0

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 pouvez envisager mod_cache avec Apache. Si vous avez un objectif spécifique, tel que la fourniture de contenu Web plus rapidement, vous pouvez obtenir des améliorations de ce type, 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 mémoire RAM. Si vous souhaitez cibler certains types de performances, envisagez de tout rechercher dans / proc / sys / vm.

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

Kyle Brandt
la source
1
trouver / var / lib / mysql | xargs fadvise -will nécessaire (sale, mais il devrait permettre un accès plus rapide aux fichiers de la base de données; à titre d'exemple)
Andrioid
Très bon bidouillage, mais ce bidouillage ne désactive pas beaucoup de fsyncs en attente de mysql :( fsyncs sont nécessaires pour assurer ACID (Atomicité, Cohérence, Isolement, Durabilité).
osgx le
0

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

Cet outil s'appelle readahead http://packages.ubuntu.com/dapper/admin/readahead

Il existe également un appel système correspondant: readahead (2) http://linux.die.net/man/2/readahead

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

osgx
la source
0

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

bien que vous n'en ayez vraiment pas besoin, linux mettra assez bien en cache les fichiers que vous utilisez.

Justin
la source
0

je viens d'essayer dd si = / dev / votre partition de racine de = / dev / null \ bs = 1Mcount = combien de fois vous avez perdu

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


la source
0

J'utilise find / nom stringofrandomcharacter ça aide beaucoup

utilisateur50472
la source
0

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

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

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

Federico
la source
-1

Parfois, il se peut que je veuille mettre en cache des fichiers d’un certain dossier et de ses sous-dossiers. Je vais juste dans ce dossier et exécute ce qui suit:

trouver . -exec cp {} / dev / null \;

Et ces fichiers sont mis en cache

Highstaker
la source