问题描述
我在带有 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 (将#修改为@)