优化对磁盘的大量写入

时间:2011-12-09 18:29:04

标签: c io mmap fwrite raid

我有一个C应用程序(VStudio 2010,win7 64位)在具有双xeon芯片的机器上运行,这意味着12个物理核心和24个逻辑核心,以及192 gig的ram。 编辑:操作系统是win7(即Windows 7,64位)。

该应用程序有24个线程(每个线程都有自己的逻辑核心)进行计算并填充大量C结构的不同部分。所有线程完成后(并且线程都完全平衡,因此它们同时完成)的结构大约为60千兆字节。

(我可以控制硬件设置,因此我将使用运行RAID 0的6个2tb驱动器,这意味着写入的物理限制大约是平均顺序写入速度的6倍,或大约2千兆位/秒。 )

将此功能转移到磁盘的最有效方法是什么?显然,i / o时间会使计算时间相形见绌。根据我对这个主题的研究,看起来像write()(而不是fwrite())是要走的路。但是,在设置缓冲区大小等方面,我可以在软件方面进行哪些其他优化?mmap会更有效吗?

2 个答案:

答案 0 :(得分:8)

mmap()或boost mmap几乎总是最好的方法。操作系统比你聪明,让它担心缓存什么!

你没有说什么操作系统,但在Linux上madvise,或等效的提升提示可以真正提升性能。

答案 1 :(得分:6)

很难判断出你最好的情况。

要做的第一个优化是预分配文件。这样,您的文件系统不需要继续扩展其大小。这应该优化一些磁盘操作。但是,请避免将实际零写入磁盘。只需设定长度即可。

然后你可以在mmap和write之间做出选择。这还取决于您使用的操作系统。在Unix上我会尝试mmap和pwrite。 pwrite非常有用,因为每个线程都可以在所需的文件位置写入文件,而不会对文件偏移进行争夺。

mmap可能很好,因为您的线程不会将副本复制到文件缓存中,而是直接写入文件缓存。 60 GB可能太大而无法对整个文件进行映射,因此每个线程可能需要将自己的mmap窗口放在可以移动的文件上。

在Windows中,您可能希望尝试使用重叠的异步IO。这只能通过Win32 API调用来完成。