Назад | Перейти на главную страницу

Отключить файловый кеш для точки монтирования

Я столкнулся с ошибкой, похожей на эту:

Клиент RHEL NFS возвращает NULL байтов при чтении растущего файла

Поэтому моим решением было проверить \ 0 байтов и перечитать файл. Проблема здесь в том, что неправильный файл, который включает \ 0 байтов, кэшируется в системе, в которой запускается приложение Java. Поэтому чтение правильного содержимого файла занимает довольно много времени.

Когда я делаю sync && echo 2 > /proc/sys/vm/drop_caches он сразу же считывает правильное содержание.

Я пытался добавить sync к параметрам монтирования NFS без разницы.

Можно ли отключить файловый кеш для определенной точки монтирования? Если да, то как это сделать?

разрешение

Эта проблема обсуждалась с Red Hat Engineering в рамках частной ошибки 702085, но не могла быть исправлена ​​в течение жизненного цикла продукта RHEL 5.

Red Hat Product Management решила не устранять эту проблему в RHEL 6 по следующим причинам:

  • Подверженность клиентов этой проблеме незначительна.
  • Это поведение задокументировано на портале для клиентов вместе с обходными путями.
  • Такое поведение гораздо сложнее (занимает больше времени) воспроизвести в RHEL 6 по сравнению с RHEL 5.
  • Протокол NFS не гарантирует согласованности кеша.

Обходные пути:

  • Убедитесь, что один клиент не может прочитать файл, в то время как другой клиент обращается к нему, используя блокировки файлов, такие как стая в сценариях оболочки или fcntl() в C.
  • Откройте файл с помощью O_DIRECT чтобы избежать кеширования страниц.
  • Не читайте мимо EOF.
  • Например, в Python используйте os.stat() чтобы получить размер файла, os.open() открыть файл и os.read() читать только до размера файла.
  • Избегайте бега tail -f для файлов, находящихся на монтировках NFS.
  • При использовании RHEL 5 sync опция mount также позволит избежать этой проблемы. Это не будет работать в RHEL6, так как nfs_readpage_sync() функция была удалена в восходящем направлении между RHEL 5 и RHEL 6, так что эта функция не существует в RHEL 6.