Есть ли команда, которая заставит Linux очистить кэш одного файла на NFS-ресурсе?

14

В связи с этим вопросом о StackOverflow мне интересно, есть ли способ очистить кэш NFS / заставить Linux увидеть самую последнюю копию файла, находящегося в общей папке NFS.

У меня есть ситуация, когда четыре сервера Apache монтируют один и тот же каталог через NFS, и когда один сервер вносит изменения в файл, другим серверам требуется около 5-10 секунд, чтобы увидеть это изменение. Если в этот файл будет внесено второе изменение, оно может перезаписать первое изменение.

fstabЗапись для файловой системы:

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

Есть ли команда, которая заставит Linux очистить кэш одного файла на NFS-ресурсе?

мистифицировать
источник
Какой механизм кэширования Apache вы используете?
usermane
@usermane: я не использую механизм кэширования Apache. Эти файлы являются PHP-файлами, и когда они изменяются на одном хосте, другие хосты не видят этого изменения в течение нескольких секунд.
Джош

Ответы:

12

Проверьте эти элементы и посмотрите, есть ли что-нибудь для вас:

  1. На клиенте , если вы еще не используете ctoопцию в столбце опций/etc/fstab строки для вашей файловой системы NFS, добавьте ее. ctoприказывает клиенту nfs открывать файлы с помощью функции close-to-open, что заставляет их обновлять файл всякий раз, когда они его открывают.

  2. На сервере убедитесь, что ваша файловая система экспортируется с syncопцией, а не с async. При синхронной записи клиент будет сброшен на диск при закрытии файла. ( или с помощью nfs V3 всякий раз, когда совершается коммит () ). Таким образом, производительность может снизиться, но если вы делаете запись в файловую систему NFS, вам определенно нужно syncустановить.

  3. Следуя по пятам за этим сообщением stackoverflow, открытие файла с помощью O_DIRECT работает, только если ядро ​​было скомпилировано с помощью CONFIG_NFS_DIRECTIO.

  4. Также убедитесь, что в вашем файле httpd.conf есть следующие настройки:

    • EnableMMAP off
    • EnableSendfile off

    Из документации по настройке производительности Apache:

    • Если вы отображаете в памяти файл, расположенный в файловой системе, смонтированной в NFS, и процесс на другом клиентском компьютере NFS удаляет или усекает файл, ваш процесс может получить ошибку шины при следующей попытке доступа к содержимому сопоставленного файла.
    • Отключение EnableSendfile специально не поможет с синхронизацией / асинхронностью NFS, но его необходимо отключить, если вы используете apache с NFS.
Тим Кеннеди
источник
Благодарность! Это отличные предложения. Я не использую ctoна клиенте, и я попробую это. У меня нет syncни asyncна сервере; Я только добавил sync. O_DIRECTмне это не помогло, потому что на самом деле PHP читает эти файлы и не может открыть их O_DIRECTтак, как я могу найти.
Джош
@ Джош, это решило твою проблему? Мы заблокированы по той же проблеме! Не могли бы вы обновить этот пост?
rafa.ferreira
3

Внутри данного процесса вызов opendir и closedir в родительском каталоге файла делает недействительным кэш NFS. Я использовал это при программировании планировщика заданий. Очень, очень полезно. Попытайся!

Эрик Аронесты
источник
-1

Если вы откроете данный файл в некэшированной программе (например, vim или emacs), а затем закроете, он обновит / очистит кэш для этого файла.

Кэмерон Кларк
источник
2
Каково ваше определение «не кэшируемой программы», и есть ли у вас ссылка на это утверждение?
Ральф Фридл