赞
踩
在一次架构升级后,Python celery遇到不知名异常,致使worker异常退出,最终导致可用worker数越来越少,任务卡死队列。
异常原因从celery日志看仅一个signal 11,从linux signal信号来看,signal 11标识Segmentation violation,即段异常,涉及到linux内核的数据异常,对于应用层使用celery来说,借鉴意义不大。需要进一步的异常排查定位问题。
celery版本:4.3.0;python版本:3.6.8
由于报错信息不明,需要进一步排查,通过google捞取,整合网上资源:
1.pg突然更新导致celery中第三方包连接异常
2.celery中函数引用项目包改成函数内导包
3.celery中序列化/反序列化对象出现异常
因为1和3在项目内并没有出现,但是2又比较离谱,因为celery里涉及到项目内包的很多,并不能说明哪些需要函数内导包,哪些不需要;所以2也不符合,无奈需要重新排查,通过引入faulthandler来进行排查,会自动收集sys.stderr打印到控制台,能更具体的定位到报错代码行位于哪一行。
import faulthandler
# 开启错误日志记录
faulthandler.enable()
发现即使开启了错误日志定位,但是有效的信息还是不够,仍旧无排查方向;
最后通过逐行代码注释的形式定位到问题代码行,然后改成函数内导包后解决… 怀疑需要函数内导包的是涉及到第三方平台或者grpc通讯的,针对这类异常,celery是否无法很好地处理异常,导致段异常
参考这篇:https://stackoverflow.com/questions/69619433/run-client-channel-backup-poller-grpc-client-error-in-celery-worker
具体就是:
所以根因解决:将celery的启动方式指定成pool=gevent启动即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。