2012-01-18 104 views
4

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

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

+1

据我所知,没有最小尺寸。如果您愿意,您可以一次写入一个字节,但在这种情况下性能会很差。最佳写入可能是磁盘块大小的多倍。 – 2012-01-18 14:25:07

+0

http://stackoverflow.com/a/8803741/841108是一个非常相关的问题的答案。我建议写64k字节。也许可以进行配置,因为最佳尺寸取决于系统和硬件。 – 2012-01-18 15:03:59

+0

“据我所知,没有最小尺寸”< - 这是不正确的。我只编写了一个写例程,它返回EINVAL,因为写入大小不是512字节的倍数 – Nulik 2012-01-18 15:54:42

回答

-1

略OT改变,“我听说有512字节扇区磁盘正在变得过时,新磁盘使用8K扇区,“ - 那里有8K扇区磁盘。我相信较新的磁盘使用4K扇区大小,也称为高级格式化磁盘。 8K扇区磁盘正在考虑未来,但我怀疑是否有任何制造商已与他们出来

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