正确的芹菜过程架构和妖魔化方式

时间:2017-03-09 07:50:16

标签: django celery uwsgi django-celery supervisor

我在Python/Django上运行了uwsgi/nginx项目。对于异步任务,我们使用rabbitmq/celerydsupervisord来管理所有守护进程

版本:

  • python:2.7
  • django:1.9.7
  • 芹菜:3.1.23
  • django-celery:3.1.17

Celery有10个Direct类型的队列(比如queue1,queue2,...) 每个队列由一个单独的celeryd进程处理,该进程通过supervisord进行管理。每个supervisord流程如下所示

[program:app_queue_worker]
command=/var/www/myproj/venv/bin/celery worker -A myproj -c 2 --queue=queue1 --loglevel=INFO
directory=/var/www/myproj/
user=ubuntu
numprocs=1
autostart=true
autorestart=true
startsecs=10
exitcodes=1
stopwaitsecs = 600
killasgroup=true
priority=1000

因此,Supervisord正在运行10 Mainprocess和20 Worker进程

其他我注意到的事情是uwsgi也产生了一些芹菜工人(不明白如何以及为什么,YET)并发= 2。因此,如果我有4个uwsgi进程运行,我将有另外10个芹菜工人运行

所有这些工人每人都要200-300M的记忆?这里出了点问题我觉得不错,但是我不能把手指放在上面。芹菜不应该运行这样的内存繁重的过程?

注意: Debug = False,由于调试没有内存泄漏

如果架构正确或错误,有人可以对架构发表评论吗?

运行2-3个芹菜MainProcesses会一次监听所有队列并增加其并发性会更好吗?

更新:celery.py配置

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')

from django.conf import settings  # noqa
from chatterbox import celery_settings

app = Celery('MyProject')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
    CELERYD_CONCURRENCY=1,
)

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

2 个答案:

答案 0 :(得分:0)

对此没有简单的答案。

对我来说,uwsgi产生芹菜工人的事实是错误的。

仅创建使用所有队列的工作进程可能会导致长时间运行的任务使某些队列溢出的情况,而使用具有短运行任务的特定队列的单独工作人员可以使情况更好。一切都取决于你的用例。

300mb的剩余内存非常多。如果任务是i / o绑定,请转到多线程/ gevent。但是,如果任务是CPU绑定的,那么除了缩放过程之外别无选择。

答案 1 :(得分:0)

如果您启动并发为n的芹菜工作者,默认情况下它将生成n + 1进程。由于您产生的并发数为2的10名工人,芹菜将启动30个流程。

当不消耗队列时,每个工作者消耗大约60MB(主进程大约30MB,子进程大约2 * ~15MB)。它可能会因您的工作人员的工作而异。如果你启动10个工作者,它将消耗大约600MB的内存。

我不知道你怎么知道uwsgi也催生了一些芹菜工人。只有主管才能产生这个过程。

你可以只运行一个芹菜工作者,它可以监听所有队列的并发度为20.这将以灵活性为代价减少你的内存使用量。使用此设置,您无法开始/停止从所选队列中消费。此外,无法保证所有队列将被平等消耗。