【问题标题】:How to monitor queue health in celery如何监控 celery 中的队列健康状况
【发布时间】: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 的工具(flowerevents,但它们都具有出色的实时性 - 但没有任何自动监控/报警功能)。使用supervisord 编写自己的监控工具会更好吗?

另外,我从 django-celery 开始我的任务

【问题讨论】:

  • 你最终解决了这个问题吗?
  • 这是旧的,但我知道的备份队列的两个原因是:(1)您在任务中创建任务。如果你这样做,你最终会到达没有工人在任务中使用任务的地步,你会冻结。 (2)如果您使用请求,进行大量下载或其他任何事情,它没有默认超时,因此如果您有下载错误,它可以完全冻结。一旦工人冻结,它就完成了。

标签: python rabbitmq celery django-celery


【解决方案1】:

一个非常基本的队列看门狗可以用一个由 cron 每分钟运行一次的脚本来实现。首先,它触发一个任务,当执行时(在工作人员中),会触及一个预定义的文件,例如:

with open('/var/run/celery-heartbeat', 'w'):
    pass

然后脚本检查该文件上的修改时间戳,如果超过一分钟(或 2 分钟,或其他任何时间),则发送警报和/或重新启动工作器和/或代理。

如果您有多台机器,这会有点棘手,但同样的想法也适用。

【讨论】:

    【解决方案2】:

    我认为这是因为工人预取任务。如果这仍然是一个问题,您可以将 celery 更新到 3.1 并使用 -Ofair worker 选项。我在-Ofair 之前尝试使用的配置选项是CELERYD_PREFETCH_MULTIPLIER。但是,设置CELERYD_PREFETCH_MULTIPLIER = 1(它的最低值)并没有帮助,因为工作人员仍会提前预取一项任务。

    http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#prefork-pool-improvements 尤其是http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#caveats

    【讨论】:

      【解决方案3】:

      @goro,如果您向外部服务发出请求,您应该尝试gevent or eventlet 池实现,而不是生成 100500 个工人。我也有问题,当芹菜工人停止消费任务时,这是由celery+gevent+sentry(raven) 组合的错误引起的。

      我对 Celery 的了解是,如果一切正常,它可以在没有任何监控的情况下正常工作(目前我每天执行 >50M 任务),但如果不是,则监控对你帮助不大。 Celery 中的“灾难恢复”有点棘手,并非所有事情都会按您预期的那样工作:(

      您应该在较小的和平上打破您的解决方案,可能是在不同队列之间分离一些任务。在某些时候,您会发现导致问题的代码 sn-p。

      【讨论】:

      • 你有关于这个“芹菜+gevent+sentry(raven)组合的错误”的错误报告或其他信息的链接吗?
      • 我也有兴趣了解更多关于这个 celery+gevent+sentry(raven) 错误的信息
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多