Моя полнотекстовая поисковая система хранит проиндексированные данные в хранилище NFS. Из-за частого чтения/записи ios я хочу предварительно выделить огромное непрерывное дисковое пространство для каждого файла таблицы и поэтому прибегаю к posix_fallocate. На томе NFS моя небольшая демонстрация не удалась с ответом «EOPNOTSUPP» на posix_fallocate. Включает ли протокол/спецификация NFS сценарий posix_fallocate?
Как заставить NFS поддерживать posix_fallocate?
Ответы (1)
(Хотя в заголовке вопроса упоминается posix_fallocate
, определение posix_fallocate
означает, что EOPNOTSUPP
не является код ошибки, который он вернет. Весьма вероятно, что задавший вопрос действительно использовал fallocate
в Linux, так как МОЖЕТ вернуть EOPNOTSUPP
)
NFS может поддерживать fallocate
в Linux (http://wiki.linux-nfs.org/wiki/index.php/Fallocate ), но:
- Ваш клиент и сервер должны использовать NFS 4.2 или более позднюю версию.
- Сервер NFS 4.2+ НЕ ДОЛЖЕН реализовывать fallocate — это необязательно (см. публикацию Re: [PATCH 4/4] Удаление неработающего posix_fallocate, резервного кода posix_falllocate64 [BZ#15661] в ветке списка рассылки libc-alpha]).
Что касается posix_fallocate
, вы можете никогда не узнать, был ли вызов Linux glibc posix_fallocate
реальным или эмулированным без тщательного наблюдения или предварительной ручной проверки (например, выполнив собственный вызов платформы fallocate
и проверив, произошел ли сбой или он не поддерживается), и если вы сделали собственный вызов, зачем вам нужен вызов posix_fallocate
?. Кроме того, разные платформы имеют разные вызовы для нативного fallocate
(или полностью его не имеют), поэтому, если проблема переносимости на платформы, отличные от Linux, вам нужно будет написать соответствующие нативные fallocate
оболочки для каждой платформы. Если вам нужно выполнить предварительное выделение памяти, даже если в том, что ниже, у вас нет поддерживаемого вызова для этого, вам придется вернуться к выполнению этого вручную (например, с помощью хороших фрагментарных записей или хаков, таких как glibc posix_fallocate
...).
Примечание. Когда возможно выполнить реальное предварительное выделение (например, через fallocate
), это может быть ДРАМАТИЧЕСКИ быстрее, чем полная запись, потому что файловая система может выполнить это, просто установив соответствующие метаданные.
fallocate()
. - person Ctx   schedule 24.02.2017posix_fallocate()
поверх NFS, но эмуляция, похоже, имеет некоторые ошибки. - person Andrew Henle   schedule 24.02.2017