【发布时间】:2020-03-29 18:51:02
【问题描述】:
我们正在使用 celery 为 Django 站点运行异步任务。
当前的 worker 设置是 -pool=prefetch 和 --max-memory-per-child 5120000。最大内存阈值很重要,因为我们的任务正在泄漏内存。
现在,我们在最近的一项分析中发现,我们的任务是 I/O 绑定的,并且使用基于线程的执行池(如 gevent)会更好地工作,例如我们可以获得更高的吞吐量。
但是,基于线程的执行池不支持max-memory-per-child 参数和max-tasks-per-child 设置。文档说(source):
池支持:prefork
它们是否有任何其他 celery 配置可以帮助我限制最大工作内存和/或在 x 个任务执行后强制重新启动工作人员,或者是我们使用 cron 重新启动工作人员的唯一选择?
【问题讨论】:
-
我想问题是 gevent 协程都在一个 单个进程 中运行,因此没有像使用 prefork 并发那样简单的方法来跟踪它们各自的内存使用情况。 .. 我相当肯定,如果没有一些沉重的黑客攻击,这是无法做到的。
-
有道理。如果限制适用于整个过程,我个人认为就足够了。例如如果进程超过内存限制,请优雅地重新启动它,然后继续。
-
您应该能够通过使用 psutil 编写一个向工作人员发送 SIGINT 的小型监控应用程序,和/或在此之后创建一个新的应用程序来轻松编码...
-
感谢您的建议。我同意这不应该太难编码。但正如我在问题中所说,我正在寻找一种在 Celery 中执行此操作的方法,而不是添加任何外部工具。