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

Car*_*s00 3 c c++ linux filesystems gcc

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

  1. 不使用O_DIRECT开放标志,或
  2. O_DIRECT

请不要"自己检查"答案 - 我想从"文件系统"人那里得到答案.

Sor*_*ren 8

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

鉴于SSD设备和类似 64KB的作为操作的单元,然后我会建议的缓冲区大小64KB-128KB是最优化-这也符合我的作为具有最高吞吐量的实际经验.


Bas*_*tch 5

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

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

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

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

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

我敢打赌,最优化实际上取决于您的硬件(SSD,硬盘?)和您的系统(及其负载).