写入的最佳缓冲区大小(2)

时间:2012-01-10 12:47:08

标签: c++ c linux gcc filesystems

假设我想在文件中写入1 GB的数据,比如ext3使用write(2)系统调用的Linux文件系统,这种情况发生在繁忙的环境(很多类似的I / O很简单)。区间中的最佳缓冲区大小是什么,比如,[4 kB, 4 MB]

时这样做
  1. 未使用O_DIRECT开启标志或
  2. 使用O_DIRECT
  3. 请不要“自己检查”答案 - 我想从“文件系统”人那里得到答案。

3 个答案:

答案 0 :(得分:8)

根据我的经验,答案更多地依赖于底层设备和硬件而不是文件系统本身 - 即设备上的缓冲区缓存,以及设备以小块等方式写入的功能 - 但是你应该永远不要写入比文件系统块大小更小的文件(stat(.) - 可能大约 4kb ) - 同样地,你不应该超越CPU的L2 / L3缓存大小在许多情况下,它可以低至 512kb

鉴于SSD设备和类似的喜欢 64kb作为操作单元,那么我建议缓冲区大小 64kb-128kb 是最优的 - 这也与我的经验经验相对应,具有最高的吞吐量。

答案 1 :(得分:5)

正如评论中所讨论的那样,我认为确切的大小并不重要,假设它是:

  • 文件系统大小的一小部分(请参阅Joachim Pileborg的评论,建议stat(".")等。)
  • 两个人的力量(因为计算机和像他们一样的内核)
  • 不太大(例如适合处理器内的某些缓存,例如L2缓存)
  • 在内存中对齐(例如使用posix_memalign对齐页面大小。)

因此,16k字节和几兆字节之间的2的幂应该是合适的。大部分时间都花在阅读磁盘上。文件系统和磁盘基准测试在这个范围内非常平坦。

4Kbytes似乎经常是页面大小和磁盘块大小。

当然,在制作文件系统块大小为mke2fs的文件系统时,您可以调整内容,甚至调整。

我敢打赌,最佳选择真的取决于您的硬件(SSD,硬盘?)和您的系统(及其负载)。

答案 2 :(得分:0)

包括stdio.h应该将BUFSIZ定义为系统的最佳大小。这绝不是保证,但如果您没有能力进行广泛的基准测试,那么它是正确的使用价值,并且它是此类基准测试的良好起点。