Czy istnieje polecenie, które zmusi Linuksa do opróżnienia pamięci podręcznej jednego pliku na udziale NFS?

14

W związku z tym pytaniem dotyczącym StackOverflow zastanawiam się, czy istnieje sposób, aby opróżnić pamięć podręczną NFS / zmusić Linuksa, aby wyświetlić najbardziej aktualną kopię pliku znajdującego się w udziale NFS.

Mam sytuację, w której cztery serwery Apache montują ten sam katalog za pośrednictwem NFS, a gdy jeden serwer wprowadza zmianę do pliku, inne serwery zauważą tę zmianę w ciągu około 5–10 sekund. Jeśli druga zmiana zostanie wprowadzona do tego pliku w tym oknie, może ona zastąpić pierwszą zmianę.

fstabWejście do systemu plików to:

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

Czy istnieje polecenie, które zmusi Linuksa do opróżnienia pamięci podręcznej jednego pliku na udziale NFS?

Josh
źródło
Jakiego mechanizmu buforowania Apache używasz?
usermane
@ użytkownik: Nie używam mechanizmu buforowania Apache. Pliki, o których mowa, to pliki PHP, a kiedy są modyfikowane na jednym hoście, inne hosty nie widzą tej zmiany przez kilka sekund.
Josh

Odpowiedzi:

12

Sprawdź te elementy i sprawdź, czy coś dla Ciebie działa:

  1. Na kliencie , jeśli jeszcze nie korzystasz z ctoopcji w kolumnie opcji/etc/fstab wiersza dla systemu plików NFS, dodaj ją. ctomówi klientowi nfs, aby otwierał pliki przez zamknięcie, co powoduje, że odświeżają plik za każdym razem, gdy go otwierają.

  2. Na serwerze upewnij się, że system plików został wyeksportowany z syncopcją, a nie async. W przypadku zapisów synchronicznych klient zostanie opróżniony na dysk, gdy plik zostanie zamknięty. ( lub z nfs V3, ilekroć dokonywana jest commit () ). W ten sposób może wystąpić spadek wydajności, ale jeśli robisz zapisy do systemu plików NFS, zdecydowanie chcesz syncustawić.

  3. Idąc za piętami tego postu przepełnienia stosu, otwieranie pliku za pomocą O_DIRECT działa tylko wtedy, gdy jądro zostało skompilowane z CONFIG_NFS_DIRECTIO.

  4. Upewnij się także, że w pliku httpd.conf masz następujące ustawienia:

    • EnableMMAP off
    • EnableSendfile off

    Z dokumentacji dostrajania wydajności apache:

    • Jeśli mapujesz pamięć pliku znajdującego się w systemie plików podłączonym do systemu plików NFS, a proces na innym komputerze klienta NFS usuwa lub obcina plik, proces może otrzymać błąd magistrali przy następnej próbie uzyskania dostępu do mapowanej zawartości pliku.
    • Wyłączenie EnableSendfile nie pomoże konkretnie w zachowaniu synchronizacji / asynchronizacji NFS, ale należy je wyłączyć, jeśli używasz apache z NFS.
Tim Kennedy
źródło
Dzięki! To są świetne sugestie. Nie używam ctona kliencie i spróbuję tego. Nie mam syncani asyncna serwerze; Właśnie dodałem sync. O_DIRECTnie pomogło mi, ponieważ to PHP czyta te pliki i nie może ich otworzyć O_DIRECTw żaden sposób, jaki mogę znaleźć.
Josh
@Josh, czy to rozwiązało problem? Jesteśmy zablokowani w tej samej sprawie! Czy możesz zaktualizować ten post?
rafa.ferreira
3

W ramach danego procesu wywołanie opendir i closedir w katalogu nadrzędnym pliku unieważnia pamięć podręczną NFS. Użyłem tego podczas programowania harmonogramu zadań. Bardzo, bardzo pomocny. Spróbuj!

Erik Aronesty
źródło
-1

Jeśli otworzysz dany plik w niebuforowanym programie (takim jak vim lub emacs), a następnie zamkniesz, zaktualizuje / wyczyści pamięć podręczną tego pliku

Cameron Clarke
źródło
2
Jaka jest twoja definicja „niebuforowanego programu” i czy masz odniesienie do tej instrukcji?
RalfFriedl