Linux O_DIRECT是否绕过文件系统日志记录?
open(2)的手册页仅建议O_DIRECT绕过页面缓存,但网络上的许多描述都将其描述为导致用户缓冲区直接DMA到驱动器。如果是这种情况,我想它也会绕过文件系统(例如xfs、ext4等)所做的日志记录。是这样吗 我找不到任何人提出这样或那样的要求。在我看来,这与数据库使用的O_DIRECT是一致的——O_DIRECT的常见示例是,像数据库这样的应用程序在用户空间中进行自己的缓存,类似地,我可以想象数据库做自己的事务日志Linux O_DIRECT是否绕过文件系统日志记录?,linux,file,io,dma,Linux,File,Io,Dma,open(2)的手册页仅建议O_DIRECT绕过页面缓存,但网络上的许多描述都将其描述为导致用户缓冲区直接DMA到驱动器。如果是这种情况,我想它也会绕过文件系统(例如xfs、ext4等)所做的日志记录。是这样吗 我找不到任何人提出这样或那样的要求。在我看来,这与数据库使用的O_DIRECT是一致的——O_DIRECT的常见示例是,像数据库这样的应用程序在用户空间中进行自己的缓存,类似地,我可以想象数据库做自己的事务日志 O_是否直接绕过文件系统日志记录 通常是这样。然而,文件数据通常不会进入文件
O_是否直接
绕过文件系统日志记录
通常是这样。然而,文件数据通常不会进入文件系统的日志。下面有更多详细信息(但请注意,这个答案并没有试图解释CoW文件系统):
大多数Linux日志文件系统(当日志设置为写回或排序(默认设置为Ext4)、XFS、JFS等)都没有记录文件中的数据,而是记录文件系统数据结构(元数据)的一致性
文件系统日志仅元数据(典型情况):文件中的数据不会进入日志,因此使用O\u DIRECT
不会改变这一点,数据也不会继续进入日志。但是,O_DIRECT
操作仍然可以像正常操作一样触发元数据更新,但是启动操作可以在元数据更新之前返回。有关详细信息,请参阅
journal=data模式下的Ext4:这是一个更棘手的问题-有一个警告,在journal=data
模式下使用O_DIRECT
所期望的结果可能不是预期的结果。从:
启用此模式[日志=数据]将禁用延迟分配和O_DIRECT
支持
在这个场景中,O_DIRECT
被看作仅仅是一个提示,文件系统会悄悄地退回到页面缓存中填充数据(使其不再直接!)。因此,在这种情况下,是的,数据将最终进入日志,日志不会被绕过。Ted Ts'o表达这一点的地方见“”线。有一些补丁在(“”)周围浮动,以使文件系统在打开时返回一个错误,但从我所看到的来看,这些补丁被主线内核拒绝了