利用 Celery Gevent Worker + RabbitMQ 的全并发

问题描述

我在带有 RabbitMQ 的 Django 中使用具有 Gevent 池类型和 100 并发的 Celery,但在任何时候我只能注意到在运行我的测试时最多 15 个任务正在执行或处于“已启动”状态2000 多个任务在队列中等待。任务被正确路由到通用“任务”队列,一切都成功运行,但是我对 15 个任务的最大值感到困惑。我已经监控了内存使用情况,但在执行期间没有注意到任何高使用率模式。

如果我添加一个额外的重复工作器,我的并发数会增加到 30 个任务。我想知道是否有任何限制,或者这只是一个并发为 100 的工作进程能够根据我的特定任务类型处理的最大值。

每个工人的最大值始终为 15 的事实对我来说似乎有点奇怪,因为我没有在任何位置明确设置。

这可能与RabbitMQ有关吗?我读过 RabbitMQ 应该有一个无限的预取缓冲区,所以我不太确定?

我也怀疑任何没有被成功修补的潜在库,但在我看来,一致的 15 个任务的最大值似乎是强加给系统的,而不是处理过程中的限制?

Worker init 命令:

celery -A project worker -l info  --max-memory-per-child 146484 -Q tasks --pool=gevent --concurrency=100 -n gevent_worker_1@%h

我的 celery 工人在单独的 docker 容器中运行。

芹菜配置

# celery
CELERY_broKER_URL = 'pyamqp://rabbitmq:5672'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_ALWAYS_EAGER = False
CELERY_TASK_TIME_LIMIT = 20 * 60  # set a max task time of 20 minutes
CELERY_TASK_TRACK_STARTED = True
CELERY_RESULT_EXPIRES = 60 * 60 * 24 * 5 # seconds in 5 days
CELERY_ACKS_LATE = False
CELERYD_PREFETCH_MULTIPLIER = 128

我尝试了 1 和 0 的 prefetch_multiplier,行为没有区别。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...