write(2)最佳的缓冲大小

write(2)最佳的缓冲大小,第1张

原文: Optimal buffer size for write(2)

前说一下,我想要写1GB的数据到文件中,在Linux ext3文件系统中使用 write(2)系统调用,发生了非常繁忙的环境(许多IO *** 作)。在这期间最佳的缓冲大小是多少呢,比如说,4kb,4Mb,什么时候:

1.不使用 O_DIRECT打开标识,或者

2.使用 O_DIRECT

请不要使用“取决于你自己”这样的答案----我想得到一些答案从文件系统的使用者中。

正如评论中讨论的那样,我相信精确的大小不是很重要,比如说:

1.文件系统大小的一小块

2.2的幂(因此系统和内核喜欢它)

3.不太大(适合处理器的一些缓存,比如L2缓存)

4.内存对齐(例如page大小使用posix_memalign)

所以,在 16kbytes到几M字节之间的2的幂的数都应该是可以的。大部分的时间应该是花费了在读磁盘上。文件系统和硬盘的基准应该差不多。

4kbytes通常是page和硬盘chunk的大小。

当然,你可以调整这些事情,在你使用 mke2fs制作文件系统的时候。

我敢打赌最佳的情况取决于你的硬盘(SSD还是普通硬盘)和你的系统(负载)。

根据我的经验回答,更多取决于底层设备和硬件而不是文件系统本身--即设备上的缓存,以及设备写入小块的能力。然而,你不应该写入比你文件系统块更小的数据(stat(.),一般是4kb)--同样,你不应该超出CPU L2、L3缓存大小,在大多数情况下,大小可能低到512kb。

SSD设备一般使用64kb作为 *** 作单元,因此我建议缓冲的大小在 64kb~128kb应该是最优的--这样是我的经验值。

包含stdio.h头文件,应该将BUFSIZ定义为系统的最佳大小。 这绝不是保证,但如果你无法执行广泛的基准测试,这是正确的值,或者这是一个进行基准测试的一个起始值。

linux的shell用一个exec函数把用户的命令来执行,数据写入的时候,先把数据写入到内核的缓冲区,使用write函数(linux的系统调用函数),在数据去满或者sync的时候,再把数据写入到磁盘,把数据写入到磁盘的时候使用cpu来写,写的细节,大概是cpu把所有的外设(注入磁盘,键盘,鼠标等)都有一个端口可以直接访问,不过需要有对应的驱动程序,写的时候就通过对应的接口来写,真正想彻底了解的话,必须要读linux内核代码了。。。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7210541.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存