Как заставить NFS поддерживать posix_fallocate?

Моя полнотекстовая поисковая система хранит проиндексированные данные в хранилище NFS. Из-за частого чтения/записи ios я хочу предварительно выделить огромное непрерывное дисковое пространство для каждого файла таблицы и поэтому прибегаю к posix_fallocate. На томе NFS моя небольшая демонстрация не удалась с ответом «EOPNOTSUPP» на posix_fallocate. Включает ли протокол/спецификация NFS сценарий posix_fallocate?


person toughmanwang    schedule 24.02.2017    source источник
comment
fallocate дает файловой системе шанс распределить пространство более эффективно, чем просто запись нулей в файл. Если базовая файловая система не поддерживает это, лучшее, что вы можете сделать, это открыть файл и записать количество нулевых байтов до желаемого размера файла. В большинстве случаев это будет не более неэффективно, чем использование fallocate().   -  person Ctx    schedule 24.02.2017
comment
Какая версия НФС? Какие версии ОС вы используете для клиента и сервера NFS? Можете ли вы опубликовать свой код? Обсуждения в поиске Google указывают на то, что glibc должен эмулировать posix_fallocate() поверх NFS, но эмуляция, похоже, имеет некоторые ошибки.   -  person Andrew Henle    schedule 24.02.2017


Ответы (1)


(Хотя в заголовке вопроса упоминается posix_fallocate, определение posix_fallocate означает, что EOPNOTSUPP не является код ошибки, который он вернет. Весьма вероятно, что задавший вопрос действительно использовал fallocate в Linux, так как МОЖЕТ вернуть EOPNOTSUPP)

NFS может поддерживать fallocate в Linux (http://wiki.linux-nfs.org/wiki/index.php/Fallocate ), но:

  1. Ваш клиент и сервер должны использовать NFS 4.2 или более позднюю версию.
  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), это может быть ДРАМАТИЧЕСКИ быстрее, чем полная запись, потому что файловая система может выполнить это, просто установив соответствующие метаданные.

person Anon    schedule 03.11.2017