0

我正在运行一个应用程序,它使用O_DSYNC选项打开 NFS 挂载中的文件。然后应用程序6500循环将数据字节写入文件 1000 次。

我监视了客户端的行为,并注意到它正在以 4096 和 8192 字节的批次将写入发送到底层文件系统。

根据man open,对打开的文件的写入操作O_DSYNC将按照同步 I/O 数据完整性完成的要求完成。它进一步说,

O_DSYNC provides synchronized I/O data integrity completion, meaning write operations will flush data to the underlying hardware, but will only flush metadata updates that are required to allow a subsequent read operation to complete successfully. 

我假设在底层文件系统成功写入数据之前O_DSYNCwrite()调用不会返回。这不是这里发生的事情。NFS 客户端正在缓存写入并以 4k 的倍数刷新它们。为什么会这样?

请注意,我使用的是运行 Linux 4.9 版的 Amazon EC2 实例,页面大小为 4096。

4

1 回答 1

0

设备写入只能是存储块大小的倍数:旧磁盘为 512 字节,许多新磁盘为 4096。由于文件未与磁盘块对齐,这可能会导致两个磁盘块的读取-修改-写入,从而导致对设备的 8k 写入,即使文件写入要小得多。

于 2017-08-23T21:48:55.240 回答