Кэш NFS: содержимое файла не обновляется на клиенте при изменении на сервере

11

Вот мои настройки: одна машина NFS Server (v4), несколько клиентских машин NFS.

Когда клиентский компьютер записывает файлы в монтирование NFS, другие клиенты мгновенно видят новый контент: нет проблем.

Но, когда серверный компьютер изменяет содержимое файла, это новое содержимое не отображается на клиенте, пока я не выполню lsкаталог из клиента.

Я абсолютно озадачен этим несоответствием ... любая помощь будет принята с благодарностью!

Информация:

  • NFS 1.2.3-R1 на клиенте и сервере
  • acregmin, acregmax, acdirmin, acdirmax, lookupcache: значения по умолчанию
numberxiii
источник
1
Можете ли вы сделать небольшой эксперимент для получения дополнительной информации ?: Сделайте ls -iна клиенте перед редактированием файла на сервере, а затем снова после. Посмотрите, изменится ли число. Если они это делают, потому что сервер заменяет файл, а клиент не замечает этого, пока не выполнит повторную проверку каталога. Если это так, попробуйте установить параметр монтирования lookupcache=noneи посмотрите, не изменится ли поведение.
Патрик
2
Извините за задержку. Индод эффективно меняется. Я добавил опцию lookupcache, похоже, она работает. Я проверю снова завтра.
числоxiii

Ответы:

11

Добавление в качестве ответа на основе вашего комментария.
Решение состоит в том, чтобы добавить lookupcache=noneв ваши параметры монтирования nfs.

Что происходит, так это то, что в первый раз, когда ваш клиент читает файл, он выполняет поиск NFS, чтобы получить NID fileid. Затем он кэширует fileid NFS, и когда вы возвращаетесь, чтобы открыть файл, он использует кеш. Обычно это не проблема, так как при обновлении файла его fileid остается неизменным. Но по какой-то причине старый файл удаляется, а новый создается (или переименовывается, или что-то, где его не совпадает с файлом).
Теперь обычно это не проблема, либо когда ваш клиент пытается открыть fileid, которого там нет, он получит сообщение об ошибке от сервера и выполнит другой поиск, чтобы получить новый fileid. Но по какой-то причине NFS-сервер позволяет клиенту открыть этот старый fileid. Возможно, другой клиент имеет открытый файл, и поэтому он еще не удаляется, я не знаю.

В любом случае, способ решить эту проблему - сказать клиенту всегда делать nfslookup перед открытием файла с помощью опции монтирования nfs lookupcache=none. Недостатком является то, что это может быть дорого, если вы часто открываете файлы, так как это добавляет больше трафика на сервер NFS.

Патрик
источник
Спасибо за ваше объяснение. На сервере NFS стек экспортированного каталога - DRBD / LVM / ext4. Может быть, это вызывает "ошибку". У меня есть проблема на нескольких клиентах, но не на некоторых других ... Я передам все свои тесты и скажу, все ли в порядке с этой опцией.
числоxiii
0

Измените параметр монтирования на hard,intr. я думаю, что по умолчанию может быть мягким в вашей системе. это поможет.

johnshen64
источник
к сожалению, добавление этих параметров монтирования ничего не изменило :(
numberxiii
Для моего первого теста я делаю перемонтирование. Затем я сделал тест с другого клиента, с чистым монтированием. Проблема, кажется, исправлена: мы ждем 30
секунд,
Я собрал новый клиент (vm) для проверки: никаких проблем с контентом!
числоxiii
1
@ johnshen64 почему вы думаете, что трудно решить проблему? Твердые / мягкие значения имеют значение только в том случае, если речь идет о разрыве соединения, и не имеет ничего общего с кэшированием.
Патрик
0

Вы также можете вручную обновить кэш NFS с помощью

sudo mount /nfs-mount -o remount

... если вы не хотите добавлять какие-либо опции монтирования, снижающие производительность.

Janne
источник