好好跑着的代码,国庆回来突然报错,报错内容是:
ERROR/ForkPoolWorker-7] Thread 'ResultHandler' crashed: OSError('handle is closed',)
Traceback (most recent call last):
File "/root/kvenv/lib/python2.7/site-packages/billiard/pool.py", line 478, in run
return self.body()
File "/root/kvenv/lib/python2.7/site-packages/billiard/pool.py", line 866, in body
self.finish_at_shutdown()
File "/root/kvenv/lib/python2.7/site-packages/billiard/pool.py", line 883, in finish_at_shutdown
ready, task = poll(1.0)
File "/root/kvenv/lib/python2.7/site-packages/billiard/pool.py", line 1326, in _poll_result
if self._outqueue._reader.poll(timeout):
File "/root/kvenv/lib/python2.7/site-packages/billiard/connection.py", line 285, in poll
self._check_closed()
File "/root/kvenv/lib/python2.7/site-packages/billiard/connection.py", line 165, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
ERROR/MainProcess] Process 'ForkPoolWorker-7' pid:31664 exited with 'exitcode 1'
查了一上午的 google,只有 celery 的一个 git issue 是一样的报错,里面提到是 gevent 的问题。排查了自己的代码,只有一个地方用到了 gevent,所以 gevent 可能是一个原因。但是奇怪的是,之前一直都没报错过,然后重启程序之后也正常了。
请问各位大佬:是否有同样碰到过这种问题的,如果有解决方案万分感谢。
目前准备舍弃 celery,简单用 mq 来做任务的分发了。被坑了两三次了,在这样下去 kpi 没了。
感谢各位。
1
lspvic 2019-10-09 12:07:24 +08:00 via Android
看来大佬们用 2. 7 的还很多呀
|
3
arrow8899 2019-10-09 13:53:00 +08:00 1
ll /proc/<pid>/fd 看一下
ulimit -n 看一下 你的任务是否设置了超时 感觉像是 socket 文件被关闭了 |
4
TheWalkingDead 2019-10-09 13:55:45 +08:00
celery 一定要做进程存活的监控。
|
5
qq976739120 2019-10-09 13:58:37 +08:00
不建议任何人在面向用户的服务上使用 celery,非常多的坑,尤其是进程假死的问题
|
6
chi1st 2019-10-09 14:12:02 +08:00
@qq976739120 那推荐使用什么呢?
|
7
qq976739120 2019-10-09 14:16:55 +08:00
@chi1st 用 kombu 自己做简单封装,排查问题会简单很多,基本封装看下这里 https://zhuanlan.zhihu.com/p/43264903
|
8
Sayihxd OP |
9
Sayihxd OP @TheWalkingDead
@qq976739120 感谢两位。 之前碰见过假死,所以后面设置了定时任务,每隔一段时间杀死所有的 celery 的进程,苟一苟。因为用了 supervisor,杀了之后,supervisor 会再拉起来。 不知道这样会不会出现问题。 |
10
qq976739120 2019-10-09 14:25:17 +08:00
@Sayihxd 哈哈哈,跟我们之前一样,然后要问一下,你这个定时任务是怎么做的?假如这个定时任务进程挂了呢?再起个定时任务监控这个定时任务吗
|
11
chi1st 2019-10-09 14:32:37 +08:00
@qq976739120 感谢
|
12
Sayihxd OP @qq976739120
目前搞的比较简单,写了 bash 脚本通过 crontab 来定时调用。 只不过您提出来的确实是个风险点。 目前这边也是准备用 rabbitmq 自己封装下了,不然这个时不时出问题太难受了。 万分感谢 |
13
lolizeppelin 2019-10-09 15:07:35 +08:00
都说了要用 openstack 的 oslo_message
用什么鬼 celery 找不到问题就是代码没读透! |