【问题标题】:Can I set max task or max memory limits for gevent pools?我可以为 gevent 池设置最大任务或最大内存限制吗?
【发布时间】: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 中执行此操作的方法,而不是添加任何外部工具。

标签: python django celery


【解决方案1】:

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

主管主管

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

内存看门狗称为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2015-03-27
    • 2019-10-07
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多