CELERYD_CONCURRENCY, --concurrency 和 autoscale

Min*_*han 1 python django concurrency multithreading celery

我有几个关于任务路由、并发性和性能的问题。这是我的用例:

我有一台专用服务器来运行 celery 任务,因此我可以使用所有 CPU 在该服务器上运行 celery 工作程序。

我有很多不同的 python 任务,我使用:CELERY_ROUTES 进行路由,因为这些任务执行真正不同类型的 python 代码,我创建了 5 个不同的 worker。这些工作器是在我使用 ansible 部署我的项目时创建的,这是一个示例:

[program:default_queue-celery]
command={{ venv_dir }}/bin/celery worker --app=django_coreapp --loglevel=INFO --concurrency=1 --autoscale=15,10 --queues=default_queue
environment =
    SERVER_TYPE="{{ SERVER_TYPE }}",
    DB_SCHEMA="{{ DB_SCHEMA }}",
    DB_USER="{{ DB_USER }}",
    DB_PASS="{{ DB_PASS }}",
    DB_HOST="{{ DB_HOST }}"
directory={{ git_dir }}
user={{ user }}
group={{ group }}
stdout_logfile={{ log_dir }}/default_queue.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=5
redirect_stderr=true
autostart=true
autorestart=true
startsecs=10
killasgroup=true 
Run Code Online (Sandbox Code Playgroud)

我在 settings.py 中还有一个 CELERY_QUEUES 来在 CELERY_ROUTES 和我的芹菜程序(队列)之间架起桥梁

CELERY_DEFAULT_QUEUE = 'default_queue'
Run Code Online (Sandbox Code Playgroud)

如果碰巧我没有路由任务,它将转到我的“default_queue”

为了给我的所有队列留出空间,我将 default_queue 的 --concurrency 设置为 1,并将我最​​重要的队列设置为更多。

但我想知道, AutoScale 对与 concurrency 相同的价值有影响吗?意思是,如果我将并发设置为 1 并将 --autoscale 设置为 15,10(上面的示例)

我的工人会在 CPU 上“工作”并在这个 CPU 上处理最多 15 个任务吗?或者这是否意味着完全不同的东西?

bru*_*ers 5

设置两者是没有意义的concurrencyautoscale因为两者都是控制给定工作实例的工作子进程数量的手段,如此处所述

--concurrency N 意味着您的工作实例将有 N 个工作子进程(意味着工作实例可以处理 N 个并发任务)。

--autoscale max, min意味着对于给定的工作实例,您将至少有min最多 max并发工作子进程。

每个进程(主工作进程或其任何子进程)将在哪个 CPU 上运行是不可预测的,这是操作系统的事情,但不要假设子进程都将在同一个 CPU 上运行(很可能他们不会 - 这是一部分实际上具有并发子进程的点)。

  • 感谢您提供这些急需的信息。因此,这两个值都将定义我在执行“htop”时看到的进程数?那么可以在 settings.py 中设置的 CELERYD_CONCURRENCY 怎么样,它是否被像 --concurrency 这样的自动缩放覆盖? (3认同)