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

C++ 写入的最佳缓冲区大小(2),c++,c,linux,gcc,filesystems,C++,C,Linux,Gcc,Filesystems,假设我想使用write(2)syscall在ext3Linux文件系统上向文件写入1GB的数据,这种情况发生在非常繁忙的环境中(许多类似的I/O同时发生)。间隔中的最佳缓冲区大小是多少,例如,在 未使用O_DIRECTopen标志,或 使用O_DIRECT 请不要“自己检查”答案——我想从“文件系统”的家伙那里得到一些答案。正如评论中所讨论的,我相信确切的大小没有那么重要,假设它是: 文件系统大小的一小倍(参见Joachim Pileborg的评论,建议stat(“.”等) 二次幂(因为计算机

假设我想使用
write(2)
syscall在
ext3
Linux文件系统上向文件写入1GB的数据,这种情况发生在非常繁忙的环境中(许多类似的I/O同时发生)。间隔中的最佳缓冲区大小是多少,例如,在

  • 未使用
    O_DIRECT
    open标志,或
  • 使用
    O_DIRECT

  • 请不要“自己检查”答案——我想从“文件系统”的家伙那里得到一些答案。

    正如评论中所讨论的,我相信确切的大小没有那么重要,假设它是:

    • 文件系统大小的一小倍(参见Joachim Pileborg的评论,建议
      stat(“.”
      等)
    • 二次幂(因为计算机和内核喜欢二次幂)
    • 不太大(例如,在处理器内部安装一些缓存,例如二级缓存)
    • 在内存中对齐(例如,使用
      posix_memalign
      将页面大小对齐)
    因此,16kbytes和几兆字节之间的2次方可能适合。大部分时间都花在读取磁盘上。在这个范围内,文件系统和磁盘基准测试相当简单

    4KB似乎通常是页面大小和磁盘块大小

    当然,您可以调整内容,甚至可以在使用
    mke2fs
    创建文件系统时调整文件系统块大小


    我敢打赌,最理想的情况实际上取决于您的硬件(SSD、硬盘?)和系统(及其负载)。

    根据我的经验,答案更多地取决于底层设备和硬件,而不是文件系统本身——即设备上的缓冲缓存,以及设备以小数据块进行写入的能力等--但是,您永远不应该以小于文件系统数据块大小的大小进行写入(
    stat(.)
    --可能约为4kb)--类似地,您不应该超出CPU的二级/三级缓存大小,在许多情况下,它可以低至512kb


    考虑到SSD设备和类似设备(如64kb)作为操作单元,那么我建议将缓冲区大小64kb-128kb作为最理想的缓冲区大小,这也符合我的经验,即具有最高吞吐量。

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

    尝试自己进行基准测试。我相信大小没有多大关系,至少在
    [16kb,1MB]
    范围内。。。。我不认为它对尺寸很敏感。。。(真正的瓶颈是磁盘硬件)您可以通过调用文件上的
    stat
    (例如
    stat(“.”
    )来获取文件系统的块大小。我认为结果应该是一个很好的缓冲区大小。@BasileStarynkevitch:尝试每次调用读取几个字节,而不是几千字节。读取大数据块时的性能改进是巨大的。但话说回来,在你给出的范围内,你可能是对的。是的,我给出的范围很重要。我知道4kb在文件系统上通常是一个页面大小和一个块大小。如果您可以调整到一个块大小并分配那么多,那么这将是一个很好的选择。不幸的是,对齐内存分配有点偶然。MSVC为您提供了一个特定的函数(
    \u aligned\u malloc
    ),还有一个称为
    memalign
    的函数,它有时会被实现。我相信
    中定义的
    BUFSIZ
    与这里提供的
    文件
    抽象相关。最初的海报讨论的是Linux上的
    write(2)
    syscalls,没有
    文件
    抽象。我不明白为什么
    BUFSIZ
    与此相关。好了,BUFSIZ是传递给setvbuf的缓冲区的大小。文件抽象的设计是为了进行有效的IO,缓冲区大小的选择通常都是考虑到这一点。同意,但是为什么
    setvbuf
    -ed大小应该与
    write
    大小相同呢?因为选择缓冲区大小是为了最大限度地提高缓冲效率。出于二进制兼容性的原因,我认为
    BUFSIZ
    没有太大变化。我猜十多年前,BUFSIZ就已经被选中了,它的约束条件和优化程度与我们现有的机器不同。