我有一个在uwsgi/nginx
上运行的Python/Django
项目。对于异步任务,我们使用rabbitmq/celeryd
和supervisord
来管理所有守护程序
版本:
- python:2.7
- django:1.9.7
- 芹菜:3.1.23
- django-celery:3.1.17
芹菜有10个队列Direct
(例如Queue1,queue2,...)每个队列都由通过Substisord进行管理的单独芹菜过程来处理。每个主管过程看起来如下
[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
因此,主管正在运行10个MainProcess和20个工作过程
我注意到的另一件事是,UWSGI还用并发= 2催生了一些芹菜工人(不了解如何以及为什么)。因此,如果我有4个UWSGI流程运行,我将有一个10个芹菜工人运行
所有这些工人每个人都有200-300m的内存?这里有些问题,我感觉到了,但我无法将手指放在上面。芹菜不应该运行这种记忆重的过程吗?
注意: debug = false,由于调试而没有内存泄漏
有人可以在架构上发表评论吗?
最好一次运行2-3个芹菜主过程,这些芹菜主过程立即聆听所有队列并增加其并发?
更新:芹菜config
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)
没有简单的答案。
对我来说,uwsgi
产生芹菜工人的事实是错误的。
仅创建消耗所有队列的工作过程可能会导致长期运行的任务会导致一些队列溢出的情况,而单独的工人使用短期运行任务的特定队列可以使情况变得更好。一切都取决于您的用例。
300MB残留内存很多。如果任务是i/o绑定的多线程/gevent。但是,如果任务是CPU绑定的,那么您别无选择。
如果您以n
的并发启动芹菜工人,则默认情况下会催生n + 1
进程。由于您要产生10名并发2的工人,因此芹菜将开始30个过程。
当不消耗队列时,每个工人都会消耗〜60MB(用于子过程的主要过程〜30MB,用于子过程的2*〜15MB)。它可能会根据您的工人在做什么而有所不同。如果您启动10名工人,它将消耗〜600MB的内存。
我不确定您是如何知道UWSGI还催生了一些芹菜工人的。只有主管才能产生该过程。
您只能运行1个芹菜工人,该工人以20的并发倾听所有队列。这将以灵活性为代价减少您的内存使用情况。使用此设置,您无法从选定的队列开始/停止消耗。同样,不能保证所有队列将被平等消耗。