linux - O_DIRECT 是否绕过文件系统日志记录?

标签 linux file io dma

open(2) 的手册页仅建议 O_DIRECT 绕过页面缓存,但网络上的许多描述将其描述为导致用户缓冲区直接通过 DMA 访问驱动器。如果是这种情况,我想它也会绕过文件系统(例如 xfs、ext4 等)完成的日志记录。是这样吗?

我找不到任何人以一种或另一种方式声明。在我看来,这与数据库使用的 O_DIRECT 是一致的——O_DIRECT 的常见示例是当像数据库这样的应用程序在用户空间中执行自己的缓存时,同样我可以想象数据库执行自己的事务日志。

最佳答案

Does O_DIRECT bypass filesystem journaling?

通常是这样。但是,文件数据通常不会进入文件系统的日志。下面有更多详细信息(但请注意,此答案不会尝试考虑 CoW 文件系统):

大多数 Linux 日志文件系统(当日志设置为回写或有序(默认)时为 Ext4、XFS、JFS 等)不记录文件内的数据 - 它们记录文件系统数据结构(元数据)的一致性。

文件系统仅记录元数据(典型情况):文件中的数据无论如何都不会进入日志,因此使用 O_DIRECT 不会改变这一点和数据继续不进入期刊。但是,O_DIRECT 操作仍然可以像正常情况一样触发元数据更新,但发起操作可以在元数据更新之前返回。查看Ext4 wiki Clarifying Direct IO's Semantics page了解详情。

Ext4 in journal=data mode:这比较棘手 - 有一个警告,在 journal=data 模式下使用 O_DIRECT 的预期结果可能不是预期的那样。来自"data=journal" section of ext4.txt :

Enabling this mode [journal=data] will disable delayed allocation and O_DIRECT support.

在这种情况下,O_DIRECT 仅被视为一个提示,文件系统默默地返回到将数据填充到页面缓存中(使其不再直接!)。所以在这种情况下,是的,数据最终会进入日志,并且不会绕过日志。请参阅“Re: [PATCH 1/1 linux-next] ext4: add compatibility flag check”线程了解 Ted Ts'o 对此的阐述。有一些补丁(“ext4: refuse O_DIRECT opens for mode where DIO doesn't work”)使文件系统在打开时返回错误,但据我所知,这些补丁被主线内核拒绝了。

关于linux - O_DIRECT 是否绕过文件系统日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33446235/

相关文章:

c - 在 Mac OS X 上,如何将 POSIX fd 转换为 FILE*?

c++文件命名(编号)与文件I/O

linux - 以绝对路径列出目录中的所有文件(不包括目录)

linux - 访问未通过 EXPORT_SYMBOL* 导出的 Linux 内核符号

php - 在 PHP 中将文件名更改为 uniqid

c - 使用 %*c 清除 scanf 缓冲区的危险

c - 原始硬盘访问/dev/sda] vs/dev/sg[y]?

c++ - 共享库链接到具有公共(public)接口(interface)但不同实现的静态库

regex - 从每行中删除部分字符串

linux - 如何使用 Red Hat Linux 上的标准工具随机化文件中的行?