Existe-t-il une commande qui forcera Linux à vider le cache d'un fichier sur un partage NFS?

14

En relation avec cette question sur StackOverflow , je me demande s'il existe un moyen pour moi de vider le cache NFS / forcer Linux à voir la copie la plus à jour d'un fichier qui se trouve sur un partage NFS.

J'ai une situation où quatre serveurs Apache montent le même répertoire via NFS, et lorsqu'un serveur modifie un fichier, il faut environ 5 à 10 secondes aux autres serveurs pour voir ce changement. Si une deuxième modification est apportée à ce fichier dans cette fenêtre, il peut remplacer la première modification.

L' fstabentrée pour le système de fichiers est:

172.16.1.15:/home               /media/home     nfs     vers=3,defaults,noauto,sync,acregmin=1          0       0

Existe-t-il une commande qui forcera Linux à vider le cache d'un fichier sur un partage NFS?

Josh
la source
Quel mécanisme de mise en cache apache utilisez-vous?
usermane
@usermane: Je n'utilise pas de mécanisme de mise en cache Apache. Les fichiers en question sont des fichiers PHP, et lorsqu'ils sont modifiés sur un hôte, les autres hôtes ne voient pas ce changement pendant quelques secondes.
Josh

Réponses:

12

Vérifiez ces éléments et voyez si certains travaux vous conviennent:

  1. Sur le client , si vous n'utilisez pas déjà l' ctooption dans la colonne des options de la /etc/fstabligne pour votre système de fichiers NFS, ajoutez-la. ctoindique au client nfs d'ouvrir les fichiers via close-to-open, ce qui leur fait actualiser le fichier chaque fois qu'ils l'ouvrent.

  2. Sur le serveur , assurez-vous que votre système de fichiers est exporté avec l' syncoption, et non async. Avec les écritures synchrones, le client videra le disque lorsque le fichier sera fermé. ( ou avec nfs V3, chaque fois qu'un commit () est effectué ). Il peut y avoir un impact sur les performances de cette façon, mais si vous effectuez des écritures sur un système de fichiers NFS, vous voulez certainement syncdéfinir.

  3. Dans la foulée de ce post stackoverflow, l'ouverture du fichier avec O_DIRECT ne fonctionne que si le noyau a été compilé avec CONFIG_NFS_DIRECTIO.

  4. Assurez-vous également que vous disposez des paramètres suivants dans votre fichier httpd.conf:

    • EnableMMAP off
    • EnableSendfile off

    Dans la documentation de réglage des performances d'apache:

    • Si vous mappez en mémoire un fichier situé sur un système de fichiers monté sur NFS et qu'un processus sur une autre machine client NFS supprime ou tronque le fichier, votre processus peut obtenir une erreur de bus la prochaine fois qu'il essaie d'accéder au contenu du fichier mappé.
    • La désactivation de EnableSendfile n'aidera pas spécifiquement le comportement de synchronisation / async de NFS, mais il doit être désactivé si vous utilisez apache avec NFS.
Tim Kennedy
la source
Merci! Ce sont d'excellentes suggestions. Je n'utilise pas ctosur le client et je vais essayer cela. Je n'ai syncni l' un ni l' autre asyncsur le serveur; Je viens d'ajouter sync. O_DIRECTne m'a pas aidé, car c'est en fait PHP qui lit ces fichiers et il ne peut pas les ouvrir O_DIRECTde quelque manière que ce soit.
Josh
@Josh, cela a-t-il résolu votre problème? Nous sommes bloqués sur le même problème! Pourriez-vous mettre à jour ce message?
rafa.ferreira
3

Dans un processus donné, appeler opendir et closedir dans le répertoire parent d'un fichier invalide le cache NFS. Je l'ai utilisé lors de la programmation d'un planificateur de travaux. Très, très utile. Essayez!

Erik Aronesty
la source
-1

Si vous ouvrez le fichier donné dans un programme non mis en cache (comme vim ou emacs) puis fermez, il mettra à jour / effacera le cache de ce fichier

Cameron Clarke
la source
2
Quelle est votre définition de «programme non mis en cache» et avez-vous une référence pour cette déclaration?
RalfFriedl