【问题标题】:Celery - Memory Leak (Memory doesn't get free even after worker completed the task)Celery - 内存泄漏(即使在工人完成任务后内存也不会释放)
【发布时间】:2019-10-11 11:48:11
【问题描述】:

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

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

这个问题还有其他解决方案吗? CELERYD_MAX_TASKS_PER_CHILD,如果 celery 每天接收大约 10,000 个任务

,应该设置什么合适的数字

【问题讨论】:

  • 在大多数情况下,内存可再次用于 Python 进程,但不会在操作系统中释放。如果没有其他进程占用大量内存,您应该没有任何问题。
  • 不行,除了修复内存泄漏没有别的办法……

标签: python django celery


【解决方案1】:

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

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

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

【讨论】:

  • 如果你愿意,你可以配置它(创建新的进程来执行 N 个任务)(当你知道你的任务正在泄漏内存时建议这样做)。
  • 这正是@RajatJain 在问题中所说的。
  • 感谢@DejanLekic 和 ali,我想我们都最终达成了共同的解决方案,我决定让 CELERYD_MAX_TASKS_PER_CHILD = 200。另外我正在分析内存优化的代码......干杯
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 2012-07-04
  • 2012-06-08
  • 2012-10-19
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多