芹菜工人在启动时停滞不前
Celery workers stalled on boot
我们晚上在 AWS 中启动一个由 250 个工作节点组成的集群来处理一些长时间的 运行 分布式任务。
工作节点是 运行 celery,命令如下:
celery -A celery_worker worker --concurrency=1 -l info -n background_cluster.i-1b1a0dbb --without-heartbeat --without-gossip --without-mingle -- celeryd.prefetch_multiplier=1
我们正在使用 rabbitmq 作为我们的代理,并且只有 1 个 rabbitmq 节点。
大约 60% 的节点声称正在侦听,但不会接收任何任务。
他们的日志如下所示:
-------------- celery@background_cluster.i-1b1a0dbb v3.1.18 (Cipater)
---- **** -----
--- * *** * -- Linux-3.2.0-25-virtual-x86_64-with-Ubuntu-14.04-trusty
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_worker:0x7f10c2235cd0
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: disabled
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> background_cluster exchange=root(direct) key=background_cluster
[tasks]
. more.celery_worker.background_cluster
[2015-10-10 00:20:17,110: WARNING/MainProcess] celery@background_cluster.i-1b1a0dbb
[2015-10-10 00:20:17,110: WARNING/MainProcess] consuming from
[2015-10-10 00:20:17,110: WARNING/MainProcess] {'background_cluster': <unbound Queue background_cluster -> <unbound Exchange root(direct)> -> background_cluster>}
[2015-10-10 00:20:17,123: INFO/MainProcess] Connected to amqp://our_server:**@10.0.11.136:5672/our_server
[2015-10-10 00:20:17,144: WARNING/MainProcess] celery@background_cluster.i-1b1a0dbb ready.
但是rabbitmq显示队列中有消息等待
如果我登录到任何工作节点并发出此命令:
celery -A celery_worker inspect active
...然后每个(之前停止的)工作节点立即抓取一个任务并开始启动。
关于原因有什么想法吗?
可能与这些开关有关?
--without-heartbeat --without-gossip --without-mingle
事实证明,这是 celery 中的一个错误,其中使用 --without-gossip
阻止事件耗尽。 Celery 的 gossip 实现非常新,它显然隐式地处理了耗尽事件,但是当你关闭它时,事情会变得有点不稳定。
此 github 问题中概述了问题的详细信息:https://github.com/celery/celery/issues/1847
Master 目前在这个 PR 中有修复:https://github.com/celery/celery/pull/2823
因此您可以通过以下三种方式之一解决此问题:
- 使用八卦(删除 --without-gossip)
- 用 https://github.com/celery/celery/pull/2823.patch
修补你的 celery 版本
- 使用 cron 作业定期 运行
celery inspect active
我们晚上在 AWS 中启动一个由 250 个工作节点组成的集群来处理一些长时间的 运行 分布式任务。
工作节点是 运行 celery,命令如下:
celery -A celery_worker worker --concurrency=1 -l info -n background_cluster.i-1b1a0dbb --without-heartbeat --without-gossip --without-mingle -- celeryd.prefetch_multiplier=1
我们正在使用 rabbitmq 作为我们的代理,并且只有 1 个 rabbitmq 节点。
大约 60% 的节点声称正在侦听,但不会接收任何任务。
他们的日志如下所示:
-------------- celery@background_cluster.i-1b1a0dbb v3.1.18 (Cipater)
---- **** -----
--- * *** * -- Linux-3.2.0-25-virtual-x86_64-with-Ubuntu-14.04-trusty
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_worker:0x7f10c2235cd0
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: disabled
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> background_cluster exchange=root(direct) key=background_cluster
[tasks]
. more.celery_worker.background_cluster
[2015-10-10 00:20:17,110: WARNING/MainProcess] celery@background_cluster.i-1b1a0dbb
[2015-10-10 00:20:17,110: WARNING/MainProcess] consuming from
[2015-10-10 00:20:17,110: WARNING/MainProcess] {'background_cluster': <unbound Queue background_cluster -> <unbound Exchange root(direct)> -> background_cluster>}
[2015-10-10 00:20:17,123: INFO/MainProcess] Connected to amqp://our_server:**@10.0.11.136:5672/our_server
[2015-10-10 00:20:17,144: WARNING/MainProcess] celery@background_cluster.i-1b1a0dbb ready.
但是rabbitmq显示队列中有消息等待
如果我登录到任何工作节点并发出此命令:
celery -A celery_worker inspect active
...然后每个(之前停止的)工作节点立即抓取一个任务并开始启动。
关于原因有什么想法吗?
可能与这些开关有关?
--without-heartbeat --without-gossip --without-mingle
事实证明,这是 celery 中的一个错误,其中使用 --without-gossip
阻止事件耗尽。 Celery 的 gossip 实现非常新,它显然隐式地处理了耗尽事件,但是当你关闭它时,事情会变得有点不稳定。
此 github 问题中概述了问题的详细信息:https://github.com/celery/celery/issues/1847
Master 目前在这个 PR 中有修复:https://github.com/celery/celery/pull/2823
因此您可以通过以下三种方式之一解决此问题:
- 使用八卦(删除 --without-gossip)
- 用 https://github.com/celery/celery/pull/2823.patch 修补你的 celery 版本
- 使用 cron 作业定期 运行
celery inspect active