我有一些关于任务路由,并发性和性能的问题。 这是我的用例:
我有一台专用服务器来运行芹菜任务,所以我可以使用所有CPU在这台服务器上运行芹菜工作者。
我有很多不同的python任务,我使用它们:CELERY_ROUTES,因为任务执行的是不同类型的python代码,我创建了5个不同的worker。 当我使用ansible部署项目时创建了这些worker,这是一个例子:
[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
我在settings.py中也有一个CELERY_QUEUES来建立CELERY_ROUTES和我的芹菜程序(队列)之间的桥梁
CELERY_DEFAULT_QUEUE = 'default_queue'
如果碰巧我没有路由任务,那么它将转到我的' default_queue'
为了给我的所有队列留出空间,我为default_queue设置了--concurrency为1,为我最重要的队列设置了更多。
但是我想知道,AutoScale对并发性的影响是否相同?意思是,如果我将并发设置为1并将--autoscale设置为15,10(上面的示例)
我的工人是否会工作'在CPU上并在此CPU上处理最多15个任务? 或者这是否意味着完全不同的东西?
答案 0 :(得分:3)
同时设置concurrency
和autoscale
是没有意义的,因为两者都是控制给定工作者实例as explained here的工作程序子进程数的方法。
--concurrency N
表示您的工作者实例将具有N个工作者子进程(意味着工作者实例可以处理N个concicure任务)。
--autoscale max, min
表示对于给定的工作程序实例,您将至少具有min
和最多max
个并发工作程序子进程。
每个进程(主工作进程或其子进程中的任何子进程)将运行在哪个CPU上是不可预测的,它是操作系统的东西,但不要假设子进程都将在同一个进程上运行CPU(很有可能他们赢了 - 这实际上是并发子进程的一部分)。