【发布时间】:2009-08-28 22:03:40
【问题描述】:
我们需要读取和统计不同类型的消息/运行 10 GB 文本文件的一些统计信息,例如 FIX 引擎 日志。我们使用 Linux,32 位,4 个 CPU,Intel,用 Perl 编码,但是 语言并不重要。
我在 Tim Bray 的文章中发现了一些有趣的提示 WideFinder project。但是,我们发现使用内存映射 本质上受 32 位架构的限制。
我们尝试使用多个进程,这似乎可行 如果我们使用 4 个进程并行处理文件,速度会更快 在 4 个 CPU 上。添加多线程可能会减慢它的速度 因为上下文切换的成本。我们尝试改变 线程池的大小,但这仍然比 简单的多进程版本。
内存映射部分不是很稳定,有时候会 2 GB 文件需要 80 秒,有时需要 7 秒,可能来自 页面错误或与虚拟内存使用有关的东西。 无论如何,Mmap 不能在 32 位上扩展超过 4 GB 架构。
我们尝试了 Perl 的 IPC::Mmap 和 Sys::Mmap。看着 也进入 Map-Reduce,但问题实际上是 I/O 绑定,处理本身就足够快了。
所以我们决定尝试通过调优来优化基本 I/O 缓冲大小、类型等
任何了解现有项目的人都可以 问题在任何语言/平台上都得到了有效解决 指向一个有用的链接或建议一个方向?
【问题讨论】:
-
2G单cpu的原始性能是多少?您可能需要确定是 I/O 问题还是 CPU 计算问题。
-
如果您真的受磁盘 (IO) 限制,那么最好的方法可能是购买更快的磁盘、更多的磁盘(在 RAID0、RAID5、RAID10 等中)或 64 位机器足够的内存将文件存储在 RAM 磁盘上。任何合理的单盘都应该能拉50MB/秒;多个快速磁盘应该能够将您推到至少 300MB/秒。
-
我建议您不要使用 Sys::Mmap 而是使用 File-Map(原因在后者的文档中说明)。无论如何,您可能不想使用 IPC::Mmap。
标签: perl io mmap performance