python - 我可以为 gevent 池设置最大任务或最大内存限制吗?
问题描述
我们正在使用 celery 为 Django 站点运行异步任务。
当前的工作人员设置-pool=prefetch
是--max-memory-per-child 5120000
. 最大内存阈值很重要,因为我们的任务正在泄漏内存。
现在,我们在最近的一项分析中发现,我们的任务是 I/O 绑定的,并且使用基于线程的执行池gevent
(例如,我们可以获得更高的吞吐量)会更好地工作。
但是,基于线程的执行池不支持max-memory-per-child
参数和设置。max-tasks-per-child
文档说(来源):
池支持:prefork
他们是否有任何其他芹菜配置可以帮助我限制最大工作内存和/或在 x 任务执行后强制重新启动工作人员,或者是我们使用 cron 重新启动工作人员的唯一选择?
解决方案
虽然 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
推荐阅读
- arduino - How to control the speed of a stepper motor using PID control and ultrasonic sensor?
- java - Query in SQL not producing result
- azure-functions - pyodbc.connect() 首次尝试从 Azure 函数连接到 Azure SQL 失败
- python - Pandas(or numpy) has problem for use. RuntimeError but I have installation
- moodle - 如何创建包含单选和多项选择的完形填空题类型?
- c# - Entity Framework: Attaching an entity of type 'Country' failed because another entity of the same type already has the same primary key value
- vue.js - 使用 vue-ellipse-progress 组件,有什么方法可以让同一个圆圈有两种不同的颜色来表示高值和低值?
- javascript - 为什么easy-autcomplete不能在Rails 6上运行?
- java - 使用 Java Hibernate API 持久化实体,如果已存在则更新
- git - 如何使用来自 ansible 的 gitlab 部署令牌?