Python celery Worker exited prematurely: signal 11 (SIGSEGV) --一种解决方案

在升级架构后,Python Celery遇到Signal 11异常导致worker退出,任务卡死。经排查,异常与第三方包连接、函数导入方式及序列化问题有关。通过逐行注释代码定位到问题,发现涉及第三方平台或gRPC通讯的函数内导包可解决问题。最终,通过指定Celery启动方式为pool=gevent解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前文

  在一次架构升级后,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是否无法很好地处理异常,导致段异常

2022.06.06更新

参考这篇:https://stackoverflow.com/questions/69619433/run-client-channel-backup-poller-grpc-client-error-in-celery-worker
具体就是:
在这里插入图片描述
所以根因解决:将celery的启动方式指定成pool=gevent启动即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值