【发布时间】:2017-03-09 07:50:15
【问题描述】:
我有一个Python/Django 项目在uwsgi/nginx 上运行。对于异步任务,我们使用rabbitmq/celeryd 和supervisord 来管理所有守护进程
版本:
- 蟒蛇:2.7
- django:1.9.7
- 芹菜:3.1.23
- django 芹菜: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 还产生了一些 celery 工人(不明白如何以及为什么,YET )并发=2。因此,如果我有 4 个 uwsgi 进程正在运行,我将有另外 10 个芹菜工人在运行
所有这些worker每个都占用200-300M内存?我感觉到这里出了点问题,但我无法将手指放在上面。芹菜不应该运行如此大量的内存进程吗?
注意:Debug=False,不存在因debug导致的内存泄漏
有人可以评论一下这个架构是对是错吗?
同时运行 2-3 个 celery 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)
【问题讨论】:
-
如何衡量 RAM 消耗?
-
top 和 htop 命令
-
uwsgi 启动工作进程是因为有多个 uwsgi 进程吗? (应该能够将 uwsgi 限制为 1 个工作人员来测试这个)
-
@Crazyshezy 我的意思是它是 VIRT、RES 还是 SHR 内存?
-
@KrzysztofSzularz - 查看 RES 值
标签: django celery uwsgi django-celery supervisord