原文:Optimal buffer size for write(2)
翻译:
前说一下,我想要写1GB的数据到文件中,在Linux ext3文件系统中使用 write(2)系统调用,发生了非常繁忙的环境(许多IO操作)。在这期间最佳的缓冲大小是多少呢,比如说,4kb,4Mb,什么时候:
1.不使用 O_DIRECT打开标识,或者
2.使用 O_DIRECT
请不要使用“取决于你自己”这样的答案----我想得到一些答案从文件系统的使用者中。
Answers1:
正如评论中讨论的那样,我相信精确的大小不是很重要,比如说:
1.文件系统大小的一小块
2.2的幂(因此系统和内核喜欢它)
3.不太大(适合处理器的一些缓存,比如L2缓存)
4.内存对齐(例如page大小使用posix_memalign)
所以,在 16kbytes到几M字节之间的2的幂的数都应该是可以的。大部分的时间应该是花费了在读磁盘上。文件系统和硬盘的基准应该差不多。
4kbytes通常是page和硬盘chunk的大小。
当然,你可以调整这些事情,在你使用 mke2fs制作文件系统的时候。
我敢打赌最佳的情况取决于你的硬盘(SSD还是普通硬盘)和你的系统(负载)。
Answers2:
根据我的经验回答,更多取决于底层设备和硬件而不是文件系统本身--即设备上的缓存,以及设备写入小块的能力。然而,你不应该写入比你文件系统块更小的数据(stat(.),一般是4kb)--同样,你不应该超出CPU L2、L3缓存大小,在大多数情况下,大小可能低到512kb。
SSD设备一般使用64kb作为操作单元,因此我建议缓冲的大小在 64kb~128kb应该是最优的--这样是我的经验值。
Answers3:
包含stdio.h头文件,应该将BUFSIZ定义为系统的最佳大小。 这绝不是保证,但如果你无法执行广泛的基准测试,这是正确的值,或者这是一个进行基准测试的一个起始值。