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.

10voto

fields Points 708

Il existe deux paramètres de noyau qui peuvent être très utiles même sans utiliser d'autres outils:

swappiness

indique au noyau Linux à quel point il doit utiliser agressivement le swap. En citant l'article Wikipedia:

Swappiness est une propriété du noyau Linux qui modifie l'équilibre entre le remplacement de la mémoire en cours d'exécution et le rejet des pages du cache de pages système. Swappiness peut être défini sur des valeurs entre 0 et 100 inclus. Une valeur faible signifie que le noyau va essayer d'éviter le swap autant que possible, tandis qu'une valeur plus élevée fera en sorte que le noyau essaie agressivement d'utiliser l'espace d'échange. La valeur par défaut est de 60, et pour la plupart des systèmes de bureau, la fixer à 100 peut affecter les performances globales, tandis que la fixer plus bas (même à 0) peut améliorer l'interactivité (diminution de la latence de réponse).

vfs_cache_pressure

En citant vm.txt:

Contrôle la propension du noyau à récupérer la mémoire utilisée pour mettre en cache les répertoires et les objets inode.

A la valeur par défaut vfs_cache_pressure=100, le noyau tentera de récupérer les dentries et inodes à un taux "équitable" par rapport au cache de pages et au cache de swap. Diminuer vfs_cache_pressure fait préférer la conservation des caches d'entrées et d'inodes. ...


En fixant le swappiness à un niveau élevé (comme 100), le noyau déplace tout ce dont il n'a pas besoin vers le swap, libérant ainsi de la RAM pour mettre en cache les fichiers. Et en réglant vfs_cache_pressure à une valeur plus basse (disons 50, pas 0!), il privilégiera la mise en cache des fichiers plutôt que de conserver les données d'application en RAM.

(Je travaille sur un grand projet Java et à chaque fois que je le lance, il consomme beaucoup de RAM et vide le cache disque, de sorte que la prochaine fois que je compile le projet, tout est lu à nouveau depuis le disque. En ajustant ces deux paramètres, je parviens à conserver les sources et la sortie compilée en cache dans la RAM, ce qui accélère considérablement le processus.)

4voto

David Allan Finch Points 11052

Vous pouvez peut-être avoir un programme qui se contente de mapper vos fichiers puis reste en cours d'exécution.

5 votes

C'est à peu près ce que fait 'fadvise' (fcoretools), autant que je sache.

3voto

Si vous avez beaucoup de mémoire, vous pouvez simplement lire les fichiers que vous souhaitez mettre en cache avec la commande cat ou similaire. Linux se chargera alors de les garder en mémoire.

2voto

Jason Down Points 13690

Je doute fortement que les fichiers soient réellement servis à partir du disque avec 3 Go de RAM libre. La mise en cache des fichiers Linux est très bonne.

Si vous constatez des E/S disque, je vous conseillerais de vérifier vos configurations de journalisation. De nombreux journaux sont définis comme non tamponnés, afin de garantir que les dernières informations de journal soient disponibles en cas de crash. Dans les systèmes qui doivent être rapides quoi qu'il en soit, utilisez une E/S de journalisation tamponnée ou utilisez un serveur de journalisation distant.

0 votes

Bien sûr, je veux juste contrôler ce qui est mis en cache.

0voto

Diego Points 1311

Il existe divers systèmes de fichiers ramfs que vous pouvez utiliser (par exemple, ramfs, tmpfs), mais en général, si les fichiers sont réellement lus aussi souvent, ils restent dans le cache de votre système de fichiers. Si votre ensemble de fichiers de travail est plus grand que votre RAM libre, alors les fichiers seront effacés - mais si votre ensemble de fichiers de travail est plus grand que votre RAM libre, il n'y a aucun moyen de tout le stocker dans une ramdisk non plus.

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

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