c - 即使应用程序使用 O_DSYNC 打开文件,NFS 客户端也会聚合写入请求

标签 c io linux-kernel nfs nfsclient

我正在运行一个应用程序,该应用程序使用 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。

最佳答案

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

关于c - 即使应用程序使用 O_DSYNC 打开文件,NFS 客户端也会聚合写入请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45848862/

相关文章:

c# - 无法使用 C# 复制文件

java - 使用方法从文本文件获取输出时,未处理的异常类型IOException

c - DMA和Cache同时使用

c - 为什么 Linux 内核模块中定义的 mmap 返回 MAP_FAILED?

c - 在 C 中比较字符串的最快方法

c - 什么算法可以在线性时间内对新值和重复值进行排序,而不使用额外的空间?

c - C 中 const 关键字的歧义

python - 如何使用 ftplib 在远程服务器上创建 .txt 文件并使用变量在其中放置一些字符串?

copy_from_user 给出空指针

在c中比较两个具有相同名称的不同字符串