使用带有eventlet的maxtasksperchild

时间:2016-05-24 19:29:35

标签: python python-2.7 memory-leaks celery eventlet

我们有一些与一些芹菜工人的python应用程序。

我们使用下一个命令启动芹菜工人:

python celery -A proj worker --queue=myqueue -P prefork --maxtasksperchild=500

我们的芹菜工人有两个问题。

  1. 我们有内存泄漏
  2. 我们有很大的负担,我们需要很多工人来快速处理所有事情
  3. 我们仍在调查内存泄漏,但由于它的遗留代码很难找到原因,因此需要一些时间来解决此问题。为防止泄漏,我们使用--maxtasksperchild,因此处理500个事件后,每个工作人员都会重新启动。并且它工作正常,内存增长到某种程度。

    第二个问题有点困难。要处理芹菜队列中的所有事件,我们必须启动更多的工作人员。但是prefork每个进程占用大量内存(在我们的例子中大约为110M),所以我们要么需要很多服务器来启动正确数量的工作者,要么我们必须从prefork切换到{{1 }}:

    eventlet

    在这种情况下,我们将使用相同数量的内存(每个进程大约110M),但每个进程将有10个工作程序,这是更高的内存效率。但问题是我们仍然遇到问题#1(内存泄漏),我们无法使用python celery -A proj worker --queue=myqueue -P eventlet --concurrency=10 因为它不能与--maxtasksperchild一起使用。

    有任何想法如何使用eventlet--maxtasksperchild之类的内容?

1 个答案:

答案 0 :(得分:2)

  • 升级Celery,我只是快速扫描主代码,他们承诺max-memory-per-child。希望它适用于所有并发模型。我还没有尝试过。
  • 设置进程监控,向高于内存阈值的工作人员发送正常终止信号。适合我。
  • 在内存有限的控制组中运行Celery。适合我。