Какие аргументы posix_fadvise () для последовательной записи файла? - PullRequest
16 голосов
/ 21 сентября 2010

Я работаю над приложением, которое последовательно записывает большой файл (и вообще не читает), и я хотел бы использовать posix_fadvise() для оптимизации поведения файловой системы.

Описание функции на странице руководства предполагает, что наиболее подходящей стратегией будет POSIX_FADV_SEQUENTIAL. Однако описание реализации Linux сомневается, что:

В Linux POSIX_FADV_NORMAL устанавливает окно чтения заголовка на размер по умолчанию для устройства поддержки; POSIX_FADV_SEQUENTIAL удваивает этот размер, а POSIX_FADV_RANDOM полностью отключает чтение файла.

Поскольку я пишу только данные (возможно, перезаписываю файлы), я не ожидаю повторного чтения. Должен ли я тогда придерживаться моего POSIX_FADV_SEQUENTIAL или, скорее, использовать POSIX_FADV_RANDOM, чтобы отключить его?

Как насчет других опций, таких как POSIX_FADV_NOREUSE? Или может вообще не использовать posix_fadvise() для письма?

Ответы [ 3 ]

37 голосов
/ 21 сентября 2010

Большинство флагов posix_fadvise() (например, POSIX_FADV_SEQUENTIAL и POSIX_FADV_RANDOM) являются подсказками о чтении вперед, а не о записи.

Здесь есть несколько советов от Линуса здесь и здесь о получении хорошей производительности последовательной записи.Идея состоит в том, чтобы разбить файл на окна большого размера (8 МБ), а затем выполнить цикл:

  • Записать окно N с помощью write();
  • Запросить асинхронную записьокна N с sync_file_range(..., SYNC_FILE_RANGE_WRITE)
  • Дождитесь завершения записи окна N-1 с sync_file_range(..., SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER)
  • Удалите окно N-1 из кэша страниц с помощью posix_fadvise(..., POSIX_FADV_DONTNEED)

Таким образом, в кэше страниц никогда не бывает данных больше двух окон, но ядро ​​все равно записывает часть кэша страниц на диск при заполнении следующей части.

5 голосов
/ 21 сентября 2010

Все зависит от временной локализации ваших данных. Если вашему приложению не понадобятся данные вскоре после того, как они были записаны, вы можете использовать POSIX_FADV_NOREUSE, чтобы избежать записи в буферный кэш (аналогично O_DIRECT флажку open()).

0 голосов
/ 21 сентября 2010

Что касается записи, я думаю, что вы можете просто полагаться на планировщик ввода-вывода диска ОС, чтобы делать правильные вещи.

Следует иметь в виду, что хотя posix_fadvise специально предназначено для ядраподсказки о будущих шаблонах использования файлов, ядро ​​также имеет другие данные, чтобы помочь ему.

Если вы не открываете файл для чтения, то ему нужно будет только прочитать блоки, когда они были частично записаны.Если вам нужно было обрезать файл до 0, тогда он даже не должен этого делать (вы сказали, что перезаписываете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...