2017-03-09 41 views
3

我有一个Python/Django项目运行在uwsgi/nginx。对于异步任务中,我们使用的是rabbitmq/celerydsupervisord来管理所有的守护进程正确的方式芹菜过程体系结构和妖魔

版本:

  • 蟒蛇:2.7
  • Django的:1.9.7
  • 芹菜:3.1.23
  • django-芹菜:3.1.17

芹菜有10队列的类型Direct(比如队列1,队列2,...) 每个队列由一个单独的芹菜过程处理,该过程通过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个工作进程

我注意到另一件事是uwsgi也滋生了一些芹菜工人(不明白如何以及为何,未)并发= 2。所以,如果我有4 uwsgi进程在运行,我将有运行

所有这些工人的另外10芹菜工人每次服用200-300M内存?我觉得这里有点不对劲,但我无法把它指向它。芹菜不应该跑这样的记忆重过程?

注:调试=假,还有是由于调试

是否有人可以在体系结构上,如果它是正确的或错误的评论没有内存泄漏?

运行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) 
+0

你如何测量RAM的消耗量? –

+0

Top和htop命令 – Crazyshezy

+0

uwsgi是否启动了工作进程,因为有多个uwsgi进程? (应该能够限制uwsgi给1名工作者测试) – user2896976

回答

0

有没有简单的答案。

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

创建耗费所有的队列可能导致到长时间运行的任务做一些队列溢出而独立的工人消耗与短期运行任务的特定队列可以让情况较好的情况只工作进程。一切都取决于你的用例。

300mb剩余内存相当多。如果任务是I/O限制,请执行multi-thread/gevent。但是,如果这些任务受CPU限制,则没有其他选择,只能缩放流程。

0

如果你启动一个并行度为n的芹菜工作器,默认会产生n + 1进程。由于您产生10个并发性为2的工人,芹菜将启动30个进程。

不消耗队列时,每个工作人员消耗大约60MB(主进程〜30MB,子进程2〜15MB)。它可能取决于你的员工在做什么。如果你启动10个工人,它将消耗约600MB的内存。

我不知道你是怎么知道uwsgi也会产生一些芹菜的。只有主管应该产生这个过程。

您只能运行1个celery worker,它监听所有并发数为20的队列。这将以灵活性为代价减少内存使用量。使用此设置,您无法从选定的队列中启动/停止使用。而且,不能保证所有的队列将被平等消费。