【问题标题】:NFS client aggregates write requests even when application opens file with O_DSYNC即使应用程序使用 O_DSYNC 打开文件,NFS 客户端也会聚合写入请求
【发布时间】:2017-08-23 20:36:08
【问题描述】:

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

【问题讨论】:

  • 您在旧版本上看到了什么行为?
  • @AndrewHenle,当我在 2 台不同的机器上同时运行写入器和读取器时,写入器在循环 500 多次迭代后休眠 4 分钟。我注意到应用程序打印了一个它已写入6500xnumber_of_iterations 字节的日志,但读者声称只有几个字节短。这仅在 4.9 上可见,在 4.1 上不可见。
  • O_DSYNC 仅指您进程中的文件缓冲区。 NFS 有自己的 SYNC 选项,用于执行即时写入与缓存。您还必须在 NFS 导出中设置同步。
  • @stark,NFS 挂载配置为直写,不使用缓存

标签: c io linux-kernel nfs nfsclient


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2022-06-11
    • 2011-06-02
    • 2016-10-24
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多