Celery - 内存泄漏(即使工作人员完成任务后内存也不会释放)

Celery - Memory Leak (Memory doesn't get free even after worker completed the task)

我在 celery 服务器上有一个原子事务 运行,它消耗大量内存,但任务完成后内存没有释放。

对我有用的解决方案是在 N 个任务后杀死芹菜工人,即使用 - CELERYD_MAX_TASKS_PER_CHILD.

这个问题还有其他解决办法吗? 应该为 CELERYD_MAX_TASKS_PER_CHILD 设置多少,如果 celery 每天收到大约 10,000 个任务

芹菜上有一个 open issue 值得一试。

您的解决方法非常公平,我们在自己的业务中使用了这种解决方法,而且很简单。值得注意的是 celery 使用工作池,这意味着它不会在每个任务后杀死工作进程并将它们重新用于下一个任务,这显然意味着进程级别的资源可能会随着时间的推移而泄漏。

您可以测量进程启动和终止所需的时间。例如,如果您的任务需要 20 秒,进程启动和最终结束需要 2 秒,并且您可以容忍 5% 的开销,那么您可以将 CELERYD_MAX_TASKS_PER_CHILD 参数设置为 2。这取决于开销的数量和你可以容忍的泄漏。