【问题标题】:minimum write size with O_DIRECTO_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 文件系统,最小写入大小会有所不同吗?

【问题讨论】:

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

标签: c linux


【解决方案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 的情况下,读/写直接传递到磁盘,磁盘可以按粒度 == 扇区大小(磁盘报告的逻辑块大小)进行读/写

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2017-07-18
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多