Django Celery队列卡住了

and*_*ndy 4 python django rabbitmq celery supervisord

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

一旦我启动工作人员,任务就会执行,一切正常.

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

我的问题是:

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

我的堆栈:Django 1.4.8 Celery 3.1.16 RabbitMQ Supervisord

谢谢,安迪

Gar*_*auh 10

(1)如果你的芹菜工人有时会卡住,你可以用它strace & lsof来找出它被卡住的系统调用.

例如:

$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,
Run Code Online (Sandbox Code Playgroud)

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)
......
Run Code Online (Sandbox Code Playgroud)

它表示工作人员陷入了tcp连接(您可以5uFD列中看到).

一些python软件包requests阻止等待来自对等的数据,这可能导致芹菜工作者挂起,如果你正在使用requests,请确保设置timeout参数.

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


你看过这个页面了吗?

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