Что на самом деле означает 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).

Рекомендации

Другие вопросы по тегам