别人推送很多消息给我,用 tornado 接收然后传到 celery 里面处理
celery 进程刚启动还是没问题,运行一天半天 突然里面的任务都不处理了
重新启动下 就能把之前接收到的推送 一个个继续处理。。。
看不出是什么问题。。
打算修改下配置的处理任务的超时时间,看看能不能解决这个问题。
有人遇到过这种情况吗
1
KyleMeow 2015-12-06 11:14:50 +08:00
遇到问题,先看 log 。
|
2
shenghe 2015-12-06 11:26:26 +08:00 via Android 1
我们也碰到了这个问题,打算换
|
3
taozle 2015-12-06 11:47:03 +08:00 via iPhone 1
同样遇到了这个问题 暂时没找出来是什么原因
|
4
koykoi 2015-12-06 11:51:48 +08:00 1
什么 broker?
|
5
neoblackcap 2015-12-06 12:30:47 +08:00 via iPhone 1
猜测是有个任务抛异常,没有捕捉,就那样所有 worker 挂了
|
6
gamexg 2015-12-06 14:14:30 +08:00 1
碰到过,不过我那时 redis 在国外 celery 在国内之间网络不稳定,之后网络不好的地方就不再用 celery 了。
本地一直没碰到问题。 |
7
IMRES 2015-12-06 14:35:02 +08:00 1
碰过一次,还碰过一次和 broker 的连接断了但没有自动重连的情况。
|
8
rale 2015-12-06 14:54:45 +08:00 1
以前遇到过某个 python 的包里面没有默认设置任务超时时间,导致整个进程挂起的情况。
|
9
dai269619118 OP @koykoi redis
|
10
dai269619118 OP @neoblackcap 程序也没异常 特意把 celery 执行 zai 窗口上
|
11
dai269619118 OP @IMRES 你解决了嘛?
|
12
dai269619118 OP @rale python 包能设置任务超时嘛?能贴段代码吗
|
13
defage 2015-12-06 16:09:39 +08:00 1
用 celery flower 把已有任务都看下, 或者自己到 broker 里查就知道了,一路顺着理一下就知道原因了,消息传递的过程无非就那么几个过程
|
14
dai269619118 OP @defage 恩恩 正打算下来看下 非常感谢
|
15
SergioChan 2015-12-06 17:36:17 +08:00 1
应该是 worker 挂了。。你看过 celery 的日志了么。。里面怎么说的- -
|
16
rale 2015-12-06 17:50:38 +08:00 1
@dai269619118 我指的不是包的超时,是我的表达有问题,我是说包里面的一些函数,比如 urlopen 函数,在原来的包里默认是没有设置超时的。而且这个函数在没有设置超时的大多数情况下,是正常能用的,但是有时候会遇到等待某一个请求的情况,而且这个请求很可能已经丢掉了。我以前是通过查看 /proc/pid/wchan 看是什么情况。下面是它其中的几种状态:
poll_schedule_timeout 是在等待 I/O,不可能使用的是非阻塞 I/O.其他很多进程的状态就是这个,这是一个比较正常的状态。 futex_wait_queue_me:表示因为资源的问题产生的锁。 基本可以排除死锁的问题,因为如果是死锁,那么就应该是这个状态。 sk_wait_data:wait for some data on a network socket.根据这个可以判断该进程是在等待某一个经过 socket 传输的资源。 |
17
restran 2015-12-06 17:54:53 +08:00 1
在开发的时候有遇到 Worker 会自动结束的问题,但也一直不知道为什么。生产环境上我用 supervisor 管理 celery worker 进程,可以自动重启,目前暂时没遇到问题。
|
18
dai269619118 OP |
19
liuxiaoxiaochen 2015-12-07 10:10:23 +08:00 2
我觉得 @SergioChan 说的是对的 worker 挂了
|
20
liyj144 2015-12-07 13:33:21 +08:00 1
建议 celery 通过 flower 管理起来,这样大部分问题也能直接查到了。
|
21
julyclyde 2015-12-11 22:10:47 +08:00
据我的经验,是 celery 这个软件的质量问题
加个--time-limit 让它超时重启就行了 |