0

我有一个简单的字符串匹配脚本,可以在我的本地 Mac 上有 4 个内核的最多 8 个池工作人员进行多处理测试。但是,具有 8 个内核的 AWS c1.xlarge 上的相同脚本通常会杀死除 2 个工作人员之外的所有工作人员,CPU 仅在 25% 时工作,并且在几轮后以MemoryError.

我对服务器配置不太熟悉,所以我想知道是否有任何设置需要调整?

池实现如下所示,但似乎不是问题,因为它在本地工作。每个工人会有几千个目标,并且不会超过前五个左右。如有必要,很高兴分享更多代码。

pool = Pool(processes = numProcesses)
totalTargets = len(getTargets('all'))
targetsPerBatch = totalTargets / numProcesses
pool.map_async(runMatch, itertools.izip(itertools.repeat(targetsPerBatch), xrange(0, totalTargets, targetsPerBatch))).get(99999999)
pool.close()
pool.join()
4

1 回答 1

0

MemoryError意味着您的系统范围的虚拟内存不足。你有多少虚拟内存是一个抽象的东西,基于实际的物理 RAM 加上交换文件大小加上从其他文件分页到内存中的内容以及由于操作系统很聪明而没有在任何地方分页的内容等等。

根据您的评论,每个进程平均有 0.75GB 的实际内存和 4GB 的虚拟内存。因此,您的虚拟机总使用量为 32GB。

造成这种情况的一个常见原因是每个进程可能会达到 4GB 的峰值,但几乎所有时间都在使用比这少得多的时间。Python 很少向操作系统释放内存;它只会被分页。

无论如何,6GB 的实际内存在 8GB Mac 或 7GB c1.xlarge 实例上是没有问题的。

并且 32GB 的 VM 在 Mac 上没有问题。一个典型的 OS X 系统实际上有无限的虚拟机大小——如果你真的尝试使用所有的虚拟机,它会开始自动创建更多的交换空间,疯狂地进行分页,并让你的系统慢到爬行和/或耗尽磁盘空间,但在这种情况下不会影响您。

但是 32GB 的 VM 在 linux 上很可能是个问题。典型的 linux 系统具有固定大小的交换,并且不允许您将 VM 推到超出它可以处理的范围。(它有一个不同的技巧,可以避免首先创建可能不必要的页面……但是一旦创建了页面,就必须为它们留出空间。)我不确定 xlarge 的配置用途,但是swapon工具会告诉你有多少交换(以及你正在使用多少)。

无论如何,简单的解决方案是在您的 xlarge 上创建并启用一个额外的 32GB 交换文件。

但是,更好的解决方案是减少 VM 的使用。通常每个子流程都在做大量的设置工作,这些工作会创建不再需要的中间数据;您可以使用multiprocessing将该设置推送到完成后立即退出的不同进程中,从而释放 VM。或者,也许您可​​以找到一种更懒惰的方法来进行处理,以避免一开始就需要所有中间数据。

于 2013-09-09T20:58:35.350 回答