Je sais que je peux tout supprimer du cache du système de fichiers Linux , mais existe-t-il un moyen de supprimer un seul fichier spécifique? Ou empêcher la mise en cache d'un fichier? Ou dire à un processus de ne pas mettre en cache les fichiers qu'il écrit?
J'ai un processus qui lit beaucoup de petits fichiers et écrit un gros fichier. Je veux garder les petits fichiers en cache pour éviter les recherches de disque, et je ne me soucie pas de mettre en cache le gros fichier.
linux
files
filesystems
cache
Jay Hacker
la source
la source
Réponses:
Méthode potentielle # 1 - F_DROP_CACHES
J'ai trouvé une méthode de 2012 qui discute d'un correctif proposé pour le noyau Linux dans ce fil de discussion intitulé: Re: [RFC Patch] fs: implémente des caches de dépôt par fichier .
extraitLe thread comprend à la fois un testcase et le correctif réel de plusieurs fichiers dans le noyau Linux qui ajoute une fonction supplémentaire à
fs/drop_caches.c
appeléedrop_pagecache_file(struct file *filp)
. Cette fonction est ensuite accessible via l'outil frontend,fnctl.c
via la commandeF_DROP_CACHES
. Ce cas appelle cette fonction:Qui gère la suppression de tous les caches associés au fichier donné. Du fichier
Donc, cela peut être utilisé?include/linux/mm.h
:Je n'ai trouvé aucune preuve que ce correctif ait jamais fait son chemin dans le référentiel de code du noyau Linux, donc cette option semble être disponible, uniquement si vous êtes prêt à recompiler le noyau Linux vous-même.
Méthode potentielle n ° 2 - Utilisation de dd
Dans ce même fil, un autre utilisateur mentionne une méthodologie complètement différente qui utilise
Ce qui suit est extrait de cet e-mail Testerdd
.Je ne savais pas à 100% comment tester cela, mais j'ai proposé l'approche suivante.
créer un fichier de 100 Mo
suivre les accès aux fichiers à l'aide de
fatrace
exécuter
top
afin que nous puissions surveiller l'utilisation de la mémoire, noter le montant gratuitement.ouvrir le fichier, noter la quantité de mémoire libre maintenant. Notez
fatrace
le fichiersample.txt
.déposez le fichier de la mémoire, notez la quantité de mémoire libre maintenant. Notez la sortie de
fatrace
.Exemple
Dans le terminal # 1: Dans le terminal # 2: Dans le terminal # 3: Ouvrez maintenant le fichier,sample.txt
et notez la quantité de RAM. Dans le terminal # 1. Dans le terminal # 2: Remarquez la sortie de lafatrace
borne # 3: Maintenant, supprimez le fichier de la RAM, dans le terminal # 4: Notez la sortie de lafatrace
borne # 2: Notez la RAM dans le terminal # 3:Il semblerait donc que tout ce qui a été consommé par le fichier en RAM est libéré.
Méthode potentielle # 3 - python-fadvise
Grâce à un commentaire de @frostchutz, il existe un autre outil, un script Python, nommé
Exemple[pyadvise][4]
qui fournit une interface beaucoup plus simple que lesdd
méthodes ci-dessus . Ce script utilise la mêmeposix_fadvise(2)
interface.Et si nous répétons le test ci-dessus et utilisons
pyadvise
à la place dedd
:J'ai remarqué une baisse identique de la RAM consommée comme avant lors de l'utilisation
dd
.la source
dd
travaille pour moi. Je me suis retrouvé avec chris-lamb.co.uk/projects/python-fadvise moi-même, ce qui est la même chose dans une commande plus évidente.python-fadvise
est beaucoup plus facile, j'ai ajouté un exemple montrantdd
.os.posix_fadvise()
maintenant dans le libray standard de Python.En développant la réponse de @ geekosaur, vous pouvez forcer l'utilisation de
O_DIRECT
en utilisant LD_PRELOAD et le programme ici: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlCe code force
O_DIRECT
pour tous les fichiers. Cependant, en ajoutant simplement une logique strncmp supplémentaire,__do_wrap_open
vous pouvez appliquer sélectivement O_DIRECT.Avertissement: je n'ai pas testé cela.
la source
Vous pouvez ouvrir des fichiers individuels avec l'
O_DIRECT
indicateur (voirman 2 open
) - lisez attentivement la section NOTES de cette page de manuel et déterminez si vous le souhaitez / avez également besoinO_SYNC
.la source
cat
, et je préfère ne pas le réécrire. :) J'espérais un outil en ligne de commande ou un/proc/sys
bouton.open
drapeau; il faudrait en effet écrire un programme pour le faire. (cat -u
désactive uniquement lastdio
mise en mémoire tampon, pas la mise en mémoire tampon du système d'exploitation.)Si vous souhaitez forcer un fichier à toujours utiliser O_SYNC, vous pouvez le marquer comme tel dans les attributs étendus avec
chattr +S $file
:homme chattr:
O_SYNC force les données + métadonnées à être écrites dans les tampons de disque, mais il passe toujours par le cache de page. O_DIRECT contourne le cache de pages.
Mais sachez que son ouverture avec O_DIRECT serait préjudiciable aux performances, si le gros fichier auquel il vient d'être ajouté, la différence pourrait être faible. Mais si le gros fichier a été réécrit à des endroits aléatoires, O_DIRECT sera un très gros coup sur les performances, même en tenant compte du fait qu'il l'ayant en cache pourrait éventuellement expulser du cache certains des petits fichiers lus.
Si vous avez le ram pour y conserver tous les petits fichiers, vous pouvez aborder le problème dans l'autre sens. Assurez-vous que les petits fichiers sont toujours dans ram, alors je vous suggère de les copier dans tmpfs :
la source
chattr +S
n'est pas la même chose queO_DIRECT
, c'est la même chose queO_SYNC
.O_DIRECT
fait en sorte que les lectures ne soient pas mises en cache (c'est le sujet de cette question) et les écritures ne soient pas mises en mémoire tampon, sans aucune garantie.O_SYNC
fait que les écritures ne sont pas mises en mémoire tampon.O_DIRECT
pourO_SYNC
rendre votre réponse cohérente en interne, mais toujours faux compte tenu de la question.