Django Celery队列卡住了

时间:2015-01-02 05:59:15

标签: python django rabbitmq celery supervisord

我使用Celery / RabbitMQ与我的django应用程序执行异步任务。我刚刚开始与Celery合作。

执行任务后,一旦启动工作人员,一切都能正常运行。

问题是任务执行会在稍后停止。几个小时后,一天或有时几天。我意识到只有完成任务执行不完整的后果。然后我重新启动celery并执行所有挂起的任务,一切都恢复正常。

我的问题是:

  • 我如何调试(从哪里开始查看)以找出问题所在?
  • 如何创建一个在问题出现后立即通知我的机制?

我的筹码: Django 1.4.8 芹菜3.1.16 的RabbitMQ Supervisord

谢谢, 安迪

1 个答案:

答案 0 :(得分:10)

(1)如果您的芹菜工作者有时会遇到困难,您可以使用strace & lsof找出卡住的系统调用。

例如:

$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,

10268是芹菜工人的pid,recvfrom(5表示工人停止从文件描述符接收数据。

然后,您可以使用lsof查看此工作进程中的5

lsof -p 10268
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF      NODE NAME
......
celery  10268 root    5u  IPv4 828871825      0t0       TCP 172.16.201.40:36162->10.13.244.205:wap-wsp (ESTABLISHED)
......

它表示工作人员陷入了tcp连接(您可以在5u列中看到FD)。

某些python软件包如requests阻止等待来自对等方的数据,这可能导致芹菜工作者挂起,如果您使用requests,请确保设置timeout参数。< / p>

(2)您可以在RabbitMQ中监控您的芹菜任务队列大小,如果它在很长一段时间内持续增加,可能是芹菜工人正在罢工。

您是否看过此页:

https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/