Я столкнулся с ошибкой, похожей на эту:
Клиент 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.