问题描述
我知道 XFS 不会同步元数据,即使正在写入的文件使用 O_DIRECT
打开并且文件的元数据已更改。但是对于 ext4,我注意到 MysqL 支持 O_DIRECT_NO_FSYNC
,这意味着 MysqL 不会调用 fsync()
并让文件系统自行同步元数据。
那么问题来了:如果我在 ext4 中 open
一个带有 O_DIRECT
的文件(比如 linux 内核版本 5.8.0),并在 fsync()
之后调用 write()
, fsync()
会做什么?
另一个需要关注的问题:如果 fsync()
一个包含 open()
的文件在 ext4 中,O_DIRECT | O_SYNC
会怎么做?
谢谢!
解决方法
O_DIRECT
does not imply anything about a disk's own volatile cache。在 Linux 上,fsync()
也可以请求写回该缓存中的数据。
至于您的 fsync()
当文件已经在使用 O_DIRECT|O_SYNC
时...由于您进行了系统调用,因此会产生开销,必须检查页面缓存并且磁盘缓存刷新将被发送 - 他们只是没有任何工作要做,所以这是一种浪费。我猜您最终可能会根据文件系统刷新日志和/或其他文件的数据。