使用Pool的Python Multiprocess在AWS Ubuntu上失败

时间:2013-09-09 20:31:00

标签: python ubuntu amazon-web-services multiprocessing

我有一个简单的字符串匹配脚本,可以在我的本地mac上使用4个内核对多达8个Pool worker进行多处理测试。但是,具有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()

1 个答案:

答案 0 :(得分:0)

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

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

这样做的一个常见原因是每个进程可能达到峰值为4GB,但几乎所有时间都花费的时间远远少于此值。 Python很少向操作系统释放内存;它只会被分页。

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

32GB的VM在Mac上没问题。典型的OS X系统实际上具有无限的VM大小 - 如果您真的尝试使用它,它将开始自动创建更多的交换空间,像疯了一样分页,并使系统速度变慢并且/或磁盘空间不足,但在这种情况下,这不会影响你。

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

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

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