Что такое posix fadvise () args для последовательной записи файлов?
Я работаю над приложением, которое последовательно записывает большой файл (и не читает вообще), и я хотел бы использовать posix_fadvise() для оптимизации поведения файловой системы.
Описание функции в manpage предполагает, что наиболее подходящей стратегией будет
POSIX_FADV_SEQUENTIAL. Однако описание реализации Linux сомневается, что:
Под Linux,
POSIX_FADV_NORMALустанавливает окна опережающего считывания для размера по умолчанию для резервного устройства;POSIX_FADV_SEQUENTIALудваивает этот размер, иPOSIX_FADV_RANDOMполностью отключает чтение файла.
Поскольку я только пишу данные (возможно, и перезаписываю файлы), я не ожидаю никакого readahead. Должен ли я тогда придерживаться моего POSIX_FADV_SEQUENTIAL или, скорее, использовать POSIX_FADV_RANDOM, чтобы отключить его?
Как насчет других вариантов, таких как POSIX_FADV_NOREUSE? Или, может быть, вообще не использовать posix_fadvise() для записи?
3 ответов:
Все зависит от временной локализации ваших данных. Если ваше приложение не будет нуждаться в данных вскоре после того, как оно было записано, то вы можете использовать
POSIX_FADV_NOREUSE, чтобы избежать записи в буфер кэша (аналогично флагуO_DIRECTизopen()).
Большинство флагов
posix_fadvise()(например,POSIX_FADV_SEQUENTIALиPOSIX_FADV_RANDOM) являются намеками на readahead, а не на запись.Есть несколько советов от Linus здесь и Здесь о хорошей производительности последовательной записи. Идея состоит в том, чтобы разбить файл на большие (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)
Что касается записи, я думаю, что вы можете просто положиться на планировщик ввода-вывода диска OSes, чтобы сделать правильную вещь.
Следует иметь в виду, что в то время как
posix_fadviseсуществует специально, чтобы дать ядру подсказки о будущих моделях использования файлов, ядро также имеет другие данные, чтобы помочь ему.Если вы не открываете файл для чтения, то ему нужно будет только прочитать блоки, когда они были частично записаны. Если вы должны были сократить файл до 0, то он даже не должен этого делать (вы сказал, что ты переписываешь).
Comments