Флаг O_DIRECT для файлов - PullRequest
       4

Флаг O_DIRECT для файлов

3 голосов
/ 02 декабря 2011

Есть известная цитата Линуса, в которой говорится, что O_DIRECT бесполезен или даже ад.

Если у человека есть сверхсильные требования к скорости, на самом деле есть сценарий no для разумного использованияэтого флага для обычных файлов в Linux?

Редактировать: А как насчет "только для записи" доступа к файлам журнала?

Ответы [ 4 ]

3 голосов
/ 02 декабря 2011

Подобные эффекты можно получить с помощью fdatasync и posix_fadvise (advice = POSIX_FADV_DONTNEED.

fdatasync просто передает ваши данные на диск, но не выводит их из кэша.

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

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

Если, например, вы пишете базу данных с высокой частотой записи и ваш журнал транзакций заполняется со скоростью 10 Мбит / с, вы можете избавиться от кэшированных страниц каждые 100M или что-то еще, чтобы позволить памяти быть более полезным для других целей.

1 голос
/ 02 декабря 2011

Пропускная способность потоковой записи гораздо более детерминирована с O_DIRECT, чем без. Это находка.

Сравните пропускную способность потоковой записи, которую вы получаете от записи на блочное устройство высокоскоростного дискового массива (что-то вроде теоретической возможности hw), с пропускной способностью, которую вы получаете для файла в файловой системе в том же массиве. Убедитесь, что вы используете файловую систему с хорошей производительностью потоковой записи (xfs одна, некоторые из современных тоже могут быть). Затем вставьте O_DIRECT и посмотрите, что произойдет. Каждая версия ядра + дисковый массив, который я оценил, демонстрировали существенные различия (гораздо более широкий sd без O_DIRECT, чем с).

РЕДАКТИРОВАТЬ: честно говоря, я никогда не сравнивал write на O_DIRECT fd с mmap / madvise.

0 голосов
/ 02 декабря 2011

Вы можете получить тот же эффект согласованности, используя fdatasync или специфичный для Linux sync_file_range.

0 голосов
/ 02 декабря 2011

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

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