首页 > 解决方案 > 我可以为 gevent 池设置最大任务或最大内存限制吗?

问题描述

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

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

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

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

池支持:prefork

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

标签: pythondjangocelery

解决方案


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

超级主管

假设你通过supervisor管理你的 celery workers,有一个名为superlance的第三方插件,它为 supervisor 添加了一个内存看门狗。

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

例子

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

[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

推荐阅读