Обходит ли O_DIRECT журналирование файловой системы?

Man-страница для open(2) только предполагает, что O_DIRECT обходит кеш страниц, но во многих описаниях в сети это описывается как вызывающее прямой доступ к памяти пользовательского буфера к диску. Если это так, я полагаю, что это также позволит обойти журналирование, выполняемое файловой системой (например, xfs, ext4 и т. д.). Так ли это?

Я не могу найти никого, кто утверждает так или иначе. Мне кажется, что это согласуется с тем, что O_DIRECT используется базами данных — общий пример использования O_DIRECT — это когда приложение, такое как база данных, выполняет собственное кэширование в пользовательском пространстве, и аналогичным образом я могу представить базы данных, ведущие свои собственные журналы транзакций.


person Joseph Garvin    schedule 30.10.2015    source источник


Ответы (1)


Обходит ли O_DIRECT журналирование файловой системы?

Обычно так и есть. Однако файловые данные в любом случае обычно не попадают в журнал файловой системы. Более подробная информация ниже (но обратите внимание, что этот ответ не пытается учитывать файловые системы CoW):

Большинство журналируемых файловых систем Linux (Ext4, когда для журнала установлена ​​обратная или упорядоченная запись (по умолчанию), XFS, JFS и т. д.) не ведут журнал данных в файлах — они регистрируют согласованность структур данных файловой системы (метаданные).

Файловая система записывает в журнал только метаданные (типичный случай): Ну, данные в файлах все равно не попадают в журнал, поэтому использование O_DIRECT не меняет этого, и данные по-прежнему не попадают в журнал. Однако операции O_DIRECT по-прежнему могут инициировать обновление метаданных, как обычно, но инициирующая операция может вернуться до того, как метаданные будут обновлены. Подробнее см. на вики-страницы Ext4 Clarifying Direct IO Semantics.

Ext4 в режиме журнала=данных: это сложнее — есть предупреждение о том, что желаемый результат с O_DIRECT в режиме journal=data может отличаться от ожидаемого . Из раздела "data=journal" файла ext4.txt:

Включение этого режима [журнал=данные] отключит отложенное выделение и поддержку O_DIRECT.

В этом сценарии O_DIRECT рассматривается только как подсказка, и файловая система молча возвращается к заполнению данных в кэше страниц (что делает их более непрямыми!). Так что в этом случае да, данные попадут в журнал, и журнал не будет обойден. См. "Re: [PATCH 1/1 linux- next] ext4: добавить ветку проверки флага совместимости", где Тед Ц'о формулирует это. Есть исправления ("ext4: отказываться O_DIRECT открывается для режима, в котором DIO не работает"), чтобы вместо этого файловая система возвращала ошибку при открытии, но, насколько я вижу, они были отклонены основным ядром.

person Anon    schedule 25.02.2018