【发布时间】:2012-02-06 21:05:34
【问题描述】:
假设我想使用write(2) syscall 将 1 GB 的数据写入文件,例如ext3 Linux 文件系统,这发生在非常繁忙的环境(许多类似的 I/奥斯同时)。间隔中的最佳缓冲区大小是多少,例如,[4 kB, 4 MB] 何时这样做
- 不使用
O_DIRECT打开标志,或者 - 使用
O_DIRECT?
请不要“自己检查”的答案——我想从“文件系统”的人那里得到一些答案。
【问题讨论】:
-
尝试对自己进行基准测试。我相信大小无关紧要,至少在
[16kb, 1MB]范围内......而且我认为它对大小不是很敏感......(真正的瓶颈是磁盘硬件) -
您可以通过在文件上调用
stat(例如stat("."))来获取文件系统的块大小。我认为结果将是一个很好的缓冲区大小。 -
@BasileStarynkevitch:尝试读取几个字节而不是每次调用几千字节。读取大块时的性能提升是巨大的。但话又说回来,在你给的范围内你可能是对的。
-
是的,我给出的范围很重要。我确实知道 4kb 通常是文件系统上的页面大小和块大小。
-
如果您可以与块大小对齐并分配那么多,那么这将是一个不错的选择。不幸的是,对齐的内存分配有点偶然。 MSVC 为您提供了一个特定的功能 (
_aligned_malloc),还有另一个称为memalign的功能有时会实现。
标签: c++ c linux gcc filesystems