我可以为 gevent 池设置最大任务或最大内存限制吗?

Can I set max task or max memory limits for gevent pools?

我们正在使用 celery 运行 Django 站点的异步任务。

当前工作人员设置为 -pool=prefetch--max-memory-per-child 5120000。最大内存阈值很重要,因为我们的任务正在泄漏内存。

现在,我们在最近的分析中发现我们的任务是 I/O 绑定的,并且使用基于线程的执行池(如 gevent)会更好地工作,例如我们可以获得更高的吞吐量。

但是,基于线程的执行池不支持 max-memory-per-child 参数和 max-tasks-per-child 设置。文档说 (source):

pool support: prefork

他们是否有任何其他 celery 配置可以帮助我限制最大工作内存 and/or 强制工作人员在执行 x 次任务后重新启动,或者是我们使用 cron 重新启动工作人员的唯一选择?

虽然 Celery 不支持 gevent 的这些设置,但有一个替代解决方案我已经在我的生产中使用了一段时间并且效果很好。

超级长枪主管

假设您正在通过 supervisor, there is a third party plugin called superlance 管理您的 celery worker,这会向 supervisor 添加一个内存看门狗。

内存看门狗被称为memmon。 Memmon 将监视由 supervisor 控制的程序的内存分配,并在超过定义的阈值时自动重新启动它。

例子

这是一个主管配置示例。 worker 是被监控的celery worker程序。 Memmon 配置为每 60 秒检查一次并在超过 512MB 时重新启动 worker。请注意,此配置中的 Memmon 将执行 worker 的“热关机”,因此不会丢失任何数据。

[program:worker]
command=/home/allianceserver/venv/auth/bin/celery -A myauth worker -l info --pool=gevent --concurrency=10
directory=/home/allianceserver/myauth
user=allianceserver
numprocs=1
stdout_logfile=/home/allianceserver/myauth/log/worker.log
stderr_logfile=/home/allianceserver/myauth/log/worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs=600
killasgroup=true
priority=997

[eventlistener:memmon]
command=/home/allianceserver/venv/auth/bin/memmon -p worker=512MB
directory=/home/allianceserver/myauth
events=TICK_60