Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux O_DIRECT是否绕过文件系统日志记录?_Linux_File_Io_Dma - Fatal编程技术网

Linux 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_是否直接绕过文件系统日志记录 通常是这样。然而,文件数据通常不会进入文件

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

我找不到任何人提出这样或那样的要求。在我看来,这与数据库使用的O_DIRECT是一致的——O_DIRECT的常见示例是,像数据库这样的应用程序在用户空间中进行自己的缓存,类似地,我可以想象数据库做自己的事务日志

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表达这一点的地方见“”线。有一些补丁在(“”)周围浮动,以使文件系统在打开时返回一个错误,但从我所看到的来看,这些补丁被主线内核拒绝了