2017-03-09 6 views
3

私はuwsgi/nginxで実行中のPython/Djangoプロジェクトを持っています。セロリプロセスの正しい道アーキテクチャと悪魔化

  • のpython:2.7
  • ジャンゴ:1.9.7
  • セロリ:3.1.23
  • django-非同期タスクのために我々は、すべてのデーモン

    バージョンを管理するためにrabbitmq/celerydsupervisordを使用していますセロリ:3.1.17

セロリには、タイプDirectのキューが10個あります(たとえば、queue1、 queue2、...) 各キューは、supervisord経由で管理される別個のcelerydプロセスによって処理されます。各supervisordプロセスは、したがってSupervisordは、同時実行で(ドントはまだ、どのように、なぜ理解して)私が気づいた

他の事はuwsgiはまた、いくつかセロリの労働者を生成しますで10 Mainprocessと20ワーカー・プロセスを実行している

[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 

を以下のようになります= 2である。だから私は4 uwsgiプロセスを実行している場合、私は追加のセロリの労働者を実行する追加を持っています

これらのすべての労働者はそれぞれ200-300Mのメモリを取っている?私はそれを感じますが、私はそれに私の指を置くことができません。セロリは、そのような記憶重いプロセスを実行してはいけませんか?

注:デバッグ= Falseの、何のメモリリークが原因

をデバッグするには存在しない、それが正しいか間違っている場合、誰かがアーキテクチャについてコメントすることはできますか?

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

トップとhtopコマンド – Crazyshezy

+0

複数のuwsgiプロセスがあるため、uwsgiはワーカープロセスを起動していますか? (これをテストするために1人の作業者にuwsgiを制限する必要があります) – user2896976

答えて

0

これに対する簡単な答えはありません。

私には、uwsgiがセロリの労働者を産んだという事実は間違っています。

すべてのキューを消費するワーカー・プロセスのみを作成すると、長時間実行されるタスクでキューがオーバーフローすることがありますが、実行時間の短い特定のキューを使用する別のワーカーが状況を改善できます。すべてがあなたのユースケースに依存します。

300mbの残りのメモリは非常に多くあります。タスクがI/Oバインドされている場合は、マルチスレッド/ geventに行きます。ただし、タスクがCPUにバインドされている場合は、プロセス単位でスケーリングする以外の方法はありません。

0

並行性がnのセルリーワーカーを起動すると、既定ではn + 1プロセスが起動します。並行性2の10人の作業者を産んでいるので、セロリは30のプロセスを開始します。

各作業者は、キューを消費しないときに~60MB(メインプロセスでは~30MB、サブプロセスでは2MB〜15MB)のメモリを消費します。あなたの労働者が何をしているかによってそれは変わるかもしれません。 10人の作業者を起動すると、600MB以上のメモリが消費されます。

あなたは、uwsgiがいくつかのセロリの労働者を生み出していることを知りたがっています。スーパーバイザーだけがプロセスを起動する必要があります。

並行性が20のすべてのキューをリッスンするセルラーワーカーを1人だけ実行することができます。これにより、柔軟性を犠牲にしてメモリ使用量が削減されます。この設定では、選択したキューからの消費を開始/停止できません。また、すべてのキューが均等に消費されるという保証はありません。

関連する問題