Что на самом деле означает O_DIRECT?
Если я открою файл с O_DIRECT
флаг, означает ли это, что всякий раз, когда запись (режим блокировки) в этот файл возвращается, данные находятся на диске?
1 ответ
(Этот ответ относится к Linux - другие ОС могут иметь разные оговорки)
Давайте начнем с подвопроса:
Если я открываю файл с флагом O_DIRECT, означает ли это, что всякий раз, когда запись (режим блокировки) в этот файл возвращается, данные находятся на диске?
Нет (как прокомментировал @michael-foukarakis) - если вам нужна гарантия, что ваши данные попадут в энергонезависимое хранилище, вы должны использовать / добавить что-то еще. Как вы упомянули "гарантировать, что данные" (а не метаданные), возможно, вы ищете O_DSYNC
/ fdatasync()
? Если вы хотите гарантировать, что метаданные тоже написаны, вам придется посмотреть на O_SYNC
/ fsync()
,
Что на самом деле означает O_DIRECT?
Это подсказка, что вы хотите, чтобы ваш ввод / вывод обходил кеш ядра Linux. Что на самом деле произойдет, зависит от таких вещей, как:
- Конфигурация диска
- Используемая файловая система и ее конфигурация
- Правильно ли вы выровняли свой ввод / вывод?
- Должна ли файловая система делать новое распределение блоков, чтобы удовлетворить ваш ввод / вывод
- Версия ядра Linux
- ...
Приведенный выше список не является исчерпывающим.
Может показаться, что то, что вы предложили, может произойти в некоторых сценариях, но изменение вещей (например, использование файловой системы Ext4 вместо XFS) может ослабить то, что сделано. С голой O_DIRECT
После завершения вызова данные грязной записи все еще могут перемещаться в кэшах (например, в энергозависимом кеше диска или даже в кеше страниц ядра Linux).