【发布时间】:2013-07-08 16:54:28
【问题描述】:
我有以下设置:
- 具有 100 个工人的通用工人池
- 具有 50 名工作人员的高优先级工作人员池
- 我之所以使用如此大的数字,是因为我的任务大部分时间都在等待 I/O,而且超时时间很长(执行 HTTP 请求可能需要 20 秒才能响应)
- 使用 RabbitMQ 作为代理
- 我已经使用来自 celery'd github 的 init.d scripts 将 celeryd 设置为一个守护进程,具有以下参数:
CELERYD_OPTS="--time-limit=600 -c:low_p 100 -c:high_p 50 -Q:low_p low_priority_queue_name -Q:high_p high_priority_queue_name"
我的问题是,有时队列似乎“备份”了……也就是说它会停止消耗任务。似乎有这种情况:
- 尽管
celery inspect active会显示并非所有工作人员都已用完,但代理中“未确认”消息的积累缓慢 - 也就是说,我只会看到一些活动任务 - 队列将停止使用新任务,而不会累积。
- 当处于“死亡”状态时,在工作进程上使用
strace不会返回任何内容...来自工作进程的活动完全为零
我将不胜感激任何信息或指针:
- 如何调试它。我可以使用
strace来查看工作进程正在做什么,但到目前为止,这对于告诉我工作人员正在挂起很有用 - 如何监控这一点,以及如何进行自动恢复。有许多管理 celery 的工具(
flower和events,但它们都具有出色的实时性 - 但没有任何自动监控/报警功能)。使用supervisord 编写自己的监控工具会更好吗?
另外,我从 django-celery 开始我的任务
【问题讨论】:
-
你最终解决了这个问题吗?
-
这是旧的,但我知道的备份队列的两个原因是:(1)您在任务中创建任务。如果你这样做,你最终会到达没有工人在任务中使用任务的地步,你会冻结。 (2)如果您使用请求,进行大量下载或其他任何事情,它没有默认超时,因此如果您有下载错误,它可以完全冻结。一旦工人冻结,它就完成了。
标签: python rabbitmq celery django-celery