我有以下设置:
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
来查看工作进程正在做什么,但到目前为止,它告诉我工人正在挂起flower
和events
,但它们实时性很好 - 但没有任何自动监控/报警功能)。我最好用supervisord编写自己的监控工具吗?另外,我从django-celery开始我的任务
答案 0 :(得分:4)
一个非常基本的队列监视器只需要一个由cron每分钟运行一次的脚本即可实现。首先,它触发一个任务,当执行(在工人中)时,触摸预定义的文件,例如:
with open('/var/run/celery-heartbeat', 'w'):
pass
然后脚本检查该文件的修改时间戳,如果超过一分钟(或2分钟或其他),则发送警报和/或重新启动工作人员和/或代理。
如果你有多台机器会有点棘手,但同样的想法适用。
答案 1 :(得分:3)
@ goro,如果您向外国服务提出请求,您应该尝试gevent or eventlet池实施,而不是产生100500名工作人员。我也有问题,当芹菜工人停止消耗任务时,它是由celery+gevent+sentry(raven)组合的错误引起的。
我了解Celery的一件事是,如果一切正常(目前我正在做>每天50万个任务),它可以正常工作而无需任何监控,但如果不是,监控对你不会有什么帮助。 Celery中的“灾难恢复”有点棘手,并非所有事情都能按预期运行:(
你应该在较小的和平中打破你的解决方案,可能将不同队列之间的某些任务分开。在某些时候,你会发现导致问题的代码片段。
答案 2 :(得分:3)
我认为这是因为工人预取任务。如果这仍然是一个问题,您可以将芹菜更新为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。