【问题标题】:Correcting mis-configured celery (running with supervisord)纠正错误配置的 celery(使用 supervisord 运行)
【发布时间】:2024-08-21 19:10:02
【问题描述】:

我开始为 Python/Django Web 项目中的任务运行 celery,该项目托管在具有 8 个内核或 CPU 的单个 VM 上。我现在需要改进配置 - 我犯了菜鸟错误。

我使用supervisor 处理芹菜工人和节拍。在/etc/supervisor/conf.d/ 中,我有两个与worker 相关的conf 文件-celery1.confcelery1.conf。我应该...

1) 移除其中一个? 两者都产生不同的工人。 IE。以前的 conf 文件有command=python manage.py celery worker -l info -n celeryworker1。后者有command=python manage.py celery worker -l info -n celeryworker2。每台机器运行 1 个 worker 是权威的 stated here

2) 在 conf 中修改 numprocs 目前在 celery1.conf,我已经定义了 numprocs=2。在celery2.conf 中,我定义了numprocs=3*(见后面的页脚)。同时,在/etc/default/celeryd,我有CELERYD_OPTS="--time-limit=300 --concurrency=8"。发生什么了?在 celeryd 中,主管的 numprocs 优先于 concurrency,还是什么?我应该设置numprocs=0吗?


*两个文件的总 numprocs = 2+3 = 5。这检查出来了。 sudo supervisorctl 显示 5 个 celery 工作进程。但在 newrelic 中,我看到 45 个进程正在运行 用于 celeryd。有没有搞错?!即使主管创建的每个 proc 实际上都产生了 8 个 proc(通过 celeryd),总共 numprocs x concurrency = 5 x 8 = 40。这比 newrelic 显示的 45 少 5。需要指导来纠正这些错误。

比较截图:

【问题讨论】:

    标签: python celery django-celery supervisord celeryd


    【解决方案1】:

    这里权威地规定每台机器运行 1 个工人

    实际上,建议(“我建议”)对于这个给定的用例每台机器只运行一个工作人员

    您可能有很好的理由不这样做(例如,为不同的队列设置不同的工作人员......),并且 celery 文档指出,每个工作人员(并发)有多少个工作人员/多少个进程最有效真的取决于你任务、用法、机器等等。

    wrt/ numprocs in supervisor conf 和 concurrency in celery,这些是完全不相关的(嗯,几乎......)的事情。芹菜“工人”实际上是产生concurrency 孩子(有效处理您的任务)的主要过程。主管的numprocs 告诉主管它应该启动多少个进程(这里:芹菜工人)。因此,如果您有一个 numprocs = 2 的 celery conf 和另一个 numproc = 3 的 celery conf,这意味着您总共启动了 5 个 parents 工作进程 - 每个都产生 n 子子进程,其中 - 默认情况下 - n 是您服务器的 CPU 计数。这意味着您总共有 5 + (5*8) = 45 个工作子进程正在运行。

    你是否真的需要这么多工人是一个只有你才能回答的问题;)

    【讨论】:

    • 谢谢,很好的解释(和帽子!)。我想这让我开始研究如何可靠地调整我需要的工人数量。你能指点我什么方向吗?
    • 嗯...首先考虑一下您的任务竞争什么样的资源与有多少资源可用(假设其他进程在同一台服务器上运行),您的任务运行多长时间,频率它们被称为等-全球范围内您的使用模式是什么。如果您的任务具有非常不同的需求/使用模式,您可能希望将它们分派到不同的队列/不同的服务器(可能根据服务器将处理的队列分配不同的资源)。
    最近更新 更多