我有一个Python/Django项目运行在uwsgi/nginx上。对于异步任务,我们使用rabbitmq/celeryd和supervisord来管理所有守护进程。
版本:
芹菜有10个Direct类型的队列(例如queue1,queue2,.)每个队列由一个单独的celeryd进程处理,该进程通过监督管理。每个监督each过程如下所示
[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因此,监督正在运行10个主进程和20个工作进程。
我注意到的另一件事是,uwsgi还用concurrency=2生成了一些芹菜工人(还不知道如何和为什么)。因此,如果我有4个uwsgi进程运行,我将增加10个芹菜工人正在运行。
所有这些工人每个人都需要200到300米的内存?这里出了点问题,我感觉到了,但我不能把手指放在上面。芹菜不应该运行这么重的记忆过程吗?
注意: Debug=False,由于调试没有内存泄漏。
如果架构是正确的还是错误的,请有人对它进行评论吗?
运行2-3个同时监听所有队列并增加并发性的芹菜MainProcesses会更好吗?
更新: 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)发布于 2017-03-14 09:41:10
这个问题没有简单的答案。
对我来说,uwsgi孕育芹菜工人的事实是错误的。
只创建消耗所有队列的辅助进程可能会导致长时间运行的任务导致某些队列溢出,而使用特定队列和短运行任务的单独工作人员可能会使情况更好。一切都取决于您的用例。
300 is的剩余内存相当多。如果任务是i/o绑定的,则转到多线程/gevent。但是,如果任务是CPU绑定的,那么除了按比例调整进程外,您别无选择。
发布于 2017-03-14 12:20:30
如果您使用n的并发性启动芹菜工人,默认情况下它将生成n + 1进程。由于你是生产10个工人的并发性为2,芹菜将启动30个过程。
每个工作人员在不使用队列时消耗内存的~60 of (主进程~30 of,子进程2*~15 of)。它可能会有所不同,取决于您的员工正在做什么。如果启动10个工作人员,它将消耗大约600 10的内存。
我不知道你怎么知道乌司也生了一些芹菜工人。只有主管才能产生这一过程。
您只需运行一个芹菜工人,它可以以20的并发性侦听所有队列,这将降低您的内存使用,而代价是灵活性。使用此设置,您不能从选定的队列开始/停止消费。此外,也不能保证所有队列都将被同等地使用。
https://stackoverflow.com/questions/42689596
复制相似问题