我在celery服务器上运行了一个原子事务,该事务消耗大量内存,但任务完成后内存无法释放。
对我有用的解决方案是在完成N个任务后杀死芹菜工作者,即- CELERYD_MAX_TASKS_PER_CHILD 。
还有其他解决方案吗? 如果celery每天接收约10,000个任务,那么应该为 CELERYD_MAX_TASKS_PER_CHILD 设置一个合适的数字
答案 0 :(得分:0)
芹菜上有open issue,可能值得一试。
您的解决方法很公平,这是我们在自己的业务中使用的方法,并且很简单。值得注意的是,芹菜使用了工人池,这意味着它不会在每个任务执行后杀死工人进程,而是将其重新用于下一个任务,这显然意味着随着时间的流逝,进程级资源可能会泄漏。
您可以测量流程开始和死亡所需的时间。例如,如果您的任务花费20秒,并且流程开始并最终消失需要2秒钟,并且您可以承受5%的开销,则可以将CELERYD_MAX_TASKS_PER_CHILD
参数设置为2。这取决于开销和可以容忍的泄漏。