我有以下设置:
包含100名工人的通用工人池
拥有50名员工的高优先级员工池
我使用了这么大的数字,因为我的任务大部分时间都在等待超时很长的I/O(执行HTTP请求,可能需要20秒才能响应)。
使用rabbitmq作为代理
我已经使用来自Celery'd Github的init.dscripts将Celeryd设置为一个Deamon,参数如下: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
但它们都是实时的优秀工具,但没有任何自动监控/报警功能)。我写自己的监控工具更好吗?
另外,我从姜果芹菜开始我的任务
最佳答案
一个非常基本的队列监视程序只需要一个由cron每分钟运行的脚本就可以实现。首先,它触发一个任务,当执行该任务(在Worker中)时,该任务会接触到一个预定义的文件,例如:
with open('/var/run/celery-heartbeat', 'w'):
pass
然后,该脚本检查该文件上的修改时间戳,如果距离该文件超过一分钟(或2分钟,或其他时间),则发送警报和/或重新启动工人和/或代理。
如果你有多台机器,它会变得更加复杂,但同样的想法也适用。