O_DIRECT 的最小写入大小

Posted

技术标签:

【中文标题】O_DIRECT 的最小写入大小【英文标题】:minimum write size with O_DIRECT 【发布时间】:2012-02-13 05:58:11 【问题描述】:

我正在用 C 语言为 Linux 2.6.X 内核编写一个自定义数据库引擎,我需要知道使用 O_DIRECT 标志打开的文件的 write() 系统调用的最小写入大小是多少?在文档中它说自从 linux 2.6 内核版本以来,您可以使用 512 字节块。但是,如果我的硬盘使用 8K 块呢?在这种情况下,它会在写入时返回 EINVAL 错误吗?我听说 512 字节扇区的磁盘已经过时,而新磁盘使用 8K 扇区,所以我需要确保当用户在此类磁盘上尝试我的应用程序时不会崩溃。 如果可以在具有 8k 扇区的磁盘上使用 512 字节写入,当我写入时会发生什么,比如 2 个 512 字节的块,linux 内核是否从磁盘读取 8k 扇区,替换我告诉它的 1k 块写然后将8k扇区写回磁盘?这会很慢!

另外,关于这个问题我还有一个问题,如果我在打开文件时使用原始设备或 ext3 文件系统,最小写入大小会有所不同吗?

【问题讨论】:

据我所知,没有最小尺寸。如果您愿意,您可以一次写入一个字节,尽管在这种情况下性能会非常糟糕。最佳写入可能是磁盘块大小的倍数。 ***.com/a/8803741/841108 是对一个非常相关的问题的回答。我建议写 64k 字节。并且也许可以配置,因为最佳大小取决于系统和硬件。 “据我所知没有最小尺寸” Basile,您对链接中发布的问题的回答也不正确。 posix_memalign 与磁盘块无关。处理器的页面大小都与它无关。 Soren 的回答更正确,但仍然不清楚如果我在具有 4k 或 8k 物理扇区的磁盘上写入 512 字节会发生什么。我想我将不得不购买硬件,看看会发生什么。 【参考方案1】:

不幸的是,没有通用的方法来了解 O_DIRECT 的约束。这个手册页似乎扼杀了任何希望:

http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html

另外,我很确定块大小可能会根据底层文件系统而改变

【讨论】:

【参考方案2】:

有点 OT,“我听说 512 字节扇区的磁盘正在过时,而新磁盘使用 8K 扇区,” - 那里有 8K 扇区的磁盘吗?我相信较新的磁盘使用 4K 扇区大小,也称为高级格式磁盘。未来正在考虑 8K 扇区磁盘,但我怀疑是否有任何制造商推出了它们

关于您的查询,我认为是磁盘的扇区大小。所以如果你有一个 4K 磁盘,你需要发出一个大小为 4K 的读/写。在 O_DIRECT 的情况下,读/写直接传递到磁盘,磁盘可以按粒度 == 扇区大小(磁盘报告的逻辑块大小)进行读/写

【讨论】:

以上是关于O_DIRECT 的最小写入大小的主要内容,如果未能解决你的问题,请参考以下文章

从具有 O_DIRECT 的 HDD 读取()失败并显示 22(EINVAL,无效参数)

open(2) 中的 O_SYNC 和 O_DIRECT 标志有何不同/相似?

`O_DIRECT | 有啥区别? O_SYNC` + write() 和 `O_DIRECT` + write() + fsync()

用于随机读取的 mmap 与 O_DIRECT(涉及哪些缓冲区?)

Arch LINux 上未定义 O_DIRECT

关于O_DIRECT的那些事儿