Gibt es einen Befehl, der Linux zwingt, den Cache einer Datei auf einer NFS-Freigabe zu leeren?


14

Im Zusammenhang mit dieser Frage zu StackOverflow frage ich mich, ob ich den NFS-Cache leeren oder Linux zwingen kann, die aktuellste Kopie einer Datei auf einer NFS-Freigabe anzuzeigen.

Ich habe eine Situation, in der vier Apache-Server dasselbe Verzeichnis über NFS bereitstellen, und wenn ein Server eine Änderung an einer Datei vornimmt, dauert es ungefähr 5 bis 10 Sekunden, bis die anderen Server diese Änderung sehen. Wenn in diesem Fenster eine zweite Änderung an dieser Datei vorgenommen wird, wird möglicherweise die erste Änderung überschrieben.

Der fstabEintrag für das Dateisystem lautet:

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

Gibt es einen Befehl, der Linux zwingt, den Cache einer Datei auf einer NFS-Freigabe zu leeren?


Welchen Apache-Caching-Mechanismus verwenden Sie?
Usermane

@usermane: Ich verwende keinen Apache-Caching-Mechanismus. Die fraglichen Dateien sind PHP-Dateien, und wenn sie auf einem Host geändert werden, sehen die anderen Hosts diese Änderung für einige Sekunden nicht.
Josh

Antworten:


12

Überprüfen Sie diese Elemente und prüfen Sie, ob sie für Sie geeignet sind:

  1. Auf dem Client , wenn Sie nicht bereits die Verwendung von ctoOption in den Optionen - Spalte der /etc/fstabZeile für Ihr NFS - Dateisystem, fügen Sie es. ctoWeist den nfs-Client an, Dateien über "Close-to-Open" zu öffnen. Dadurch wird die Datei jedes Mal aktualisiert, wenn sie geöffnet wird.

  2. Stellen Sie auf dem Server sicher, dass Ihr Dateisystem mit der syncOption exportiert wird und nicht async. Bei synchronen Schreibvorgängen wird der Client beim Schließen der Datei auf die Festplatte geleert. ( oder mit nfs V3, wenn ein commit () ausgeführt wird ). Auf diese Weise kann es zu Leistungseinbußen kommen, aber wenn Sie in ein NFS-Dateisystem schreiben, möchten Sie dies auf jeden Fall tun sync.

  3. Nach diesem Stackoverflow-Post funktioniert das Öffnen der Datei mit O_DIRECT nur, wenn der Kernel mit CONFIG_NFS_DIRECTIO kompiliert wurde.

  4. Stellen Sie außerdem sicher, dass Ihre httpd.conf-Datei die folgenden Einstellungen enthält:

    • EnableMMAP off
    • EnableSendfile off

    Aus der Dokumentation zur Apache-Leistungsoptimierung:

    • Wenn Sie eine Datei, die sich auf einem NFS-gemounteten Dateisystem befindet, im Speicher zuordnen und ein Prozess auf einem anderen NFS-Client-Computer die Datei löscht oder abschneidet, wird Ihrem Prozess möglicherweise ein Busfehler angezeigt, wenn er das nächste Mal versucht, auf den Inhalt der zugeordneten Datei zuzugreifen.
    • Das Deaktivieren von EnableSendfile hilft nicht speziell beim Synchronisierungs- / Asynchronisierungsverhalten von NFS, muss jedoch deaktiviert werden, wenn Sie Apache mit NFS verwenden.

Vielen Dank! Das sind großartige Vorschläge. Ich benutze nicht ctoauf dem Client und ich werde das versuchen. Ich habe weder syncnoch asyncauf dem Server; Ich habe gerade hinzugefügt sync. O_DIRECThat mir nicht geholfen, weil es eigentlich PHP ist, das diese Dateien liest und sie nicht O_DIRECTauf irgendeine Weise öffnen kann, die ich finden kann.
Josh

@Josh, hat es dein Problem gelöst? Wir sind in der gleichen Angelegenheit blockiert! Könnten Sie bitte diesen Beitrag aktualisieren?
rafa.ferreira

3

Wenn Sie innerhalb eines bestimmten Prozesses opendir und closedir im übergeordneten Verzeichnis einer Datei aufrufen, wird der NFS-Cache ungültig. Ich habe dies beim Programmieren eines Job Schedulers verwendet. Sehr sehr hilfreich. Versuch es!


-1

Wenn Sie die angegebene Datei in einem nicht zwischengespeicherten Programm (wie vim oder emacs) öffnen und dann schließen, wird der Cache für diese Datei aktualisiert / geleert


2
Was ist Ihre Definition von "nicht zwischengespeichertem Programm" und haben Sie eine Referenz für diese Anweisung?
RalfFriedl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.