【问题标题】:Correct Way for Celery Process Architecture and demonizingCelery 进程架构和妖魔化的正确方法
【发布时间】:2017-03-09 07:50:15
【问题描述】:

我有一个Python/Django 项目在uwsgi/nginx 上运行。对于异步任务,我们使用rabbitmq/celerydsupervisord 来管理所有守护进程

版本:

  • 蟒蛇: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


【解决方案1】:

对此没有简单的答案。

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

仅创建消耗所有队列的工作进程可能会导致长时间运行的任务使某些队列溢出的情况,而使用具有短期运行任务的特定队列的单独工作人员可能会使情况变得更好。一切都取决于您的用例。

300mb 的剩余内存是相当多的。如果任务是 i/o 绑定的,请转到多线程/gevent。但是,如果任务受 CPU 限制,您别无选择,只能明智地扩展进程。

【讨论】:

    【解决方案2】:

    如果你启动一个并发n的celery worker,默认会产生n + 1进程。由于您正在生成 10 个并发 2 的工作人员,因此 celery 将启动 30 个进程。

    每个工作人员在不消耗队列时消耗约 60MB(主进程约 30MB 和子进程 2*~15MB)的内存。它可能会有所不同,具体取决于您的工人正在做什么。如果你启动 10 个 worker,它将消耗大约 600MB 的内存。

    我不知道你是怎么知道 uwsgi 也产生了一些 celery worker。只有主管应该产生这个过程。

    您可以只运行 1 个 celery worker,它以 20 的并发数侦听所有队列。这将以灵活性为代价减少您的内存使用量。使用此设置,您无法从选定的队列开始/停止消费。此外,不能保证所有队列都会被平等地消耗。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 2015-07-01
      • 2016-01-19
      • 1970-01-01
      • 2011-01-02
      • 2022-11-14
      • 2011-01-06
      • 2011-02-07
      相关资源
      最近更新 更多