2017-03-09 71 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的隊列。這將以靈活性爲代價減少內存使用量。使用此設置,您無法從選定的隊列中啓動/停止使用。而且,不能保證所有的隊列將被平等消費。