【问题标题】:Optimizing massive writes to disk优化大量写入磁盘
【发布时间】:2012-01-17 00:19:06
【问题描述】:

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

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

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

将其写入磁盘的最有效方法是什么?显然,I/O 时间将使计算时间相形见绌。从我对这个主题的研究来看,似乎 write() (而不是 fwrite() )是要走的路。但是在设置缓冲区大小等方面,我还可以在软件方面做哪些其他优化。mmap 会更有效吗?

【问题讨论】:

  • 请添加您要使用哪种语言编写的标签。这有助于其他人轻松找到此问题。
  • 计算需要多长时间?
  • 我看到了一个mmap 标签。这适用于您的系统吗?
  • 就写吧。它将通过内存到内存的复制快速复制到文件系统缓存中。在您的程序退出很久之后,它将被写入磁盘。你有足够的内存。
  • 我关于 mmap 的错误;我没有意识到如果使用visual c(我是,不是c++),这是不可用的。计算大约需要 0.5 秒。

标签: c io mmap fwrite raid


【解决方案1】:

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

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

【讨论】:

  • +1,总是,总是让别人汗流浃背,尽可能多的细节!
【解决方案2】:

很难判断最适合你的情况。

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

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

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

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

【讨论】:

  • Windows 具有等效的 mmap(CreateFileMapping、MapViewOfFile),并且由于 Zan 列出的相同原因,它可能很好。
  • 出于同样的原因(这是操作系统使用的)映射文件在 Windows 上也具有良好的性能。 Plus windows 可以将文件映射到网络驱动器上。 Unix 过去不能通过 nfs 执行 mmap - 这改变了吗?
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多