write(2)最佳的缓冲大小

原文: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定义为系统的最佳大小。 这绝不是保证,但如果你无法执行广泛的基准测试,这是正确的值,或者这是一个进行基准测试的一个起始值。

你可能感兴趣的:(write(2)最佳的缓冲大小)