【问题标题】:O_DIRECT write subbufferO_DIRECT 写子缓冲区
【发布时间】:2020-07-30 18:16:22
【问题描述】:

我正在尝试解析一些适用于 O_DIRECT 文件的代码。

ssize_t written = write(fd, buf, size);

令人困惑的是大小可以小于磁盘的扇区大小,因此write(fd,buf,size) 是否将整个buf 写入fd 或仅将size 的第一个字节buf 写入磁盘?

没有 O_DIRECT 这只是第二种情况,但我找不到关于 O_DIRECT 情况的任何文档,从我读过的内容来看,它仍然会将buf 发送到磁盘,所以我唯一的事情能想到的是它还告诉磁盘只写size...

【问题讨论】:

  • "写整个buf" --> buf有多大,一个扇区大小?
  • @stark 理想情况下,但 IME Linux 文件系统不能可靠地处理对使用 O_DIRECT 打开的文件的大小不正确(或非页面对齐)的 I/O 请求,几乎没有关于什么是“尺寸不合适”的文档。请参阅the NOTES section of the Linux open(2) man page 中的O_DIRECT 段落。
  • @AndrewHenle 我删除了我的评论。很确定我看到的 RMW 在应用程序中。未对齐的写入将始终返回 EINVAL。
  • @stark IME 未对齐缓冲区也会导致 EINVAL,但 open(2) 手册页确实说“可能完全不存在大小和对齐限制”。今天最常见的硬件应该能够处理具有任何大小的未对齐缓冲区的直接 IO,但我对低端硬件上的未对齐直接 IO 持怀疑态度,尤其是磁盘控制器/HBA。 Even expensive high-end hardware can have bugs in such situations.。鉴于那里糟糕的磁盘控制器......
  • 读取或写入未对齐的磁盘将永远无法正常工作。最小的可寻址单元是扇区。问题是关于文件访问的 O_DIRECT,其实现取决于文件系统代码。请注意,文件不必在磁盘上进行扇区对齐,尽管它们经常如此,因此文件系统可能已经有用于缓冲和修复对齐的代码。

标签: c linux


【解决方案1】:

[...] write(fd,buf,size) 是否将整个buf 写入fd 或仅将buf 的第一个size 字节写入磁盘?

如果write() 调用成功,则意味着所有请求的大小数据都已写入,但问题变为:写入到哪里?您必须记住opening a file with O_DIRECT is sending more of a hint that you want to bypass OS caches 而不是订单。文件系统可以选择简单地通过页面缓存写入 I/O,因为它总是这样做,或者因为您违反了有关对齐的规则,并且使用页面缓存是一种悄悄修复错误的方法。知道这一点的唯一方法是调查发出 I/O 时的数据路径。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多