我们有一些与一些芹菜工人的python应用程序。
我们使用下一个命令启动芹菜工人:
python celery -A proj worker --queue=myqueue -P prefork --maxtasksperchild=500
我们的芹菜工人有两个问题。
我们仍在调查内存泄漏,但由于它的遗留代码很难找到原因,因此需要一些时间来解决此问题。为防止泄漏,我们使用--maxtasksperchild
,因此处理500个事件后,每个工作人员都会重新启动。并且它工作正常,内存增长到某种程度。
第二个问题有点困难。要处理芹菜队列中的所有事件,我们必须启动更多的工作人员。但是prefork
每个进程占用大量内存(在我们的例子中大约为110M),所以我们要么需要很多服务器来启动正确数量的工作者,要么我们必须从prefork
切换到{{1 }}:
eventlet
在这种情况下,我们将使用相同数量的内存(每个进程大约110M),但每个进程将有10个工作程序,这是更高的内存效率。但问题是我们仍然遇到问题#1(内存泄漏),我们无法使用python celery -A proj worker --queue=myqueue -P eventlet --concurrency=10
因为它不能与--maxtasksperchild
一起使用。
有任何想法如何使用eventlet
和--maxtasksperchild
之类的内容?
答案 0 :(得分:2)
max-memory-per-child
。希望它适用于所有并发模型。我还没有尝试过。