在 ext4 中使用 O_DIRECT 打开() 时 fsync() 会做什么

问题描述

我知道 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 时...由于您进行了系统调用,因此会产生开销,必须检查页面缓存并且磁盘缓存刷新将被发送 - 他们只是没有任何工作要做,所以这是一种浪费。我猜您最终可能会根据文件系统刷新日志和/或其他文件的数据。