Django 芹菜加工结构和妖魔化的正确方法

Django 芹菜加工结构和妖魔化的正确方法,django,celery,uwsgi,django-celery,supervisord,Django,Celery,Uwsgi,Django Celery,Supervisord,我有一个运行在uwsgi/nginx上的Python/Django项目。对于异步任务,我们使用rabbitmq/celeryd和supervisord来管理所有守护进程 版本: python:2.7 django:1.9.7 芹菜:3.1.23 django芹菜:3.1.17 芹菜有10个队列,类型为Direct(比如队列1,队列2,…) 每个队列由一个单独的celeryd进程处理,该进程通过supervisord进行管理。每个supervisord流程如下所示 [program:app_q

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

版本:

  • python:2.7
  • django:1.9.7
  • 芹菜:3.1.23
  • django芹菜:3.1.17
芹菜有10个队列,类型为
Direct
(比如队列1,队列2,…) 每个队列由一个单独的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个主进程和20个工作进程

我注意到的另一件事是uwsgi还产生了一些芹菜工人(还不知道如何以及为什么),并发性=2。因此,如果我有4个uwsgi进程运行,我将有另外10个芹菜工人运行

所有这些工人都拥有200-300M内存?这里有点不对劲,我感觉到了,但我无法用手指触摸它。芹菜不应该运行这样的内存沉重的进程

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

有人能评论一下架构是正确的还是错误的吗

运行2-3个芹菜主进程,一次侦听所有队列并提高其并发性是否更好

更新:celery.py Config

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)

对此没有简单的答案

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

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


300mb的剩余内存相当多。如果任务是i/o绑定的,则转到多线程/gevent。但是,如果任务受CPU限制,则除了按进程扩展外,别无选择。

如果启动并发性为
n
的芹菜工作进程,默认情况下它将生成
n+1
进程。由于您正在生成10个并发度为2的worker,芹菜将启动30个进程

在不使用队列时,每个辅助进程消耗约60MB(主进程约30MB,子进程约2*~15MB)内存。这可能因员工的工作而有所不同。如果启动10个工作进程,将消耗约600MB内存

我不知道你是怎么知道uwsgi也会产生一些芹菜工人的。只有主管才能生成流程


您可以只运行一个芹菜工人,它侦听并发度为20的所有队列。这将以牺牲灵活性为代价减少内存使用。使用此设置,您无法从选定队列开始/停止消费。此外,也不能保证所有队列都将被平等地使用

如何测量RAM消耗?Top和htop命令是uwsgi启动工作进程,因为存在多个uwsgi进程?(应该能够将uwsgi限制为1个工作者来测试这个)@Crazyshezy我的意思是它是VIRT、RES还是SHR内存?@KrzysztofSzularz-查看RES值