一次线上存储节点进程假死的分析
背景
某大厂分布式存储程序猿大半夜收到电话报警,某个存储节点进程和主控节点心跳丢了。
穿着小内裤起来 检查了一番:
- ping 主控节点:网络正常
- telnet 主控节点端口: 能telnet 上
- ps -aux 检查存储节点进程: 进程还在
- 检查 日志: 日志居然不前进了!!!!
又看了一遍 存储节点主进程的状态:居然不是正常状态!!!
根据线上故障先止损后追因的原则,马上发命令check 无误后把这个节点从存储集群中下掉了。
分析过程
蛛丝马迹
看到业务恢复、故障报警消除后,开始分析root cause。
进程处于func状态, gdb attach 上去失败, gcore 也失败,根本就无法看到堆栈。
继续检查业务日志:发现故障在磁盘包障后的日志后出现。
检查内核日志:发现有块nvme 盘掉线了,和pcie root 断开了!!!
和厂商及系统部同学确认了下,出现NVME盘掉线的情况,短时不影响buffer IO ,只影响direct IO。
日志迷云
这就奇怪了,因为我们的数据流都是走page cache,而且落盘的时候用pthread, 即便磁盘坏掉了,也只应该影响这个pthread, 不应该导致整个存储进程上所有其他的线程,持续周期任务日志都打印不出来的情况。
到底是个什么鬼?
好事多磨
现有的日志和现场已经无法提供更多线索了,为了分析这个问题,只有想办法复现这个现象了。
怎么复现了?既然是坏盘影响IO,那么我就模拟坏盘吧。
搜索了一卷: 参考 磁盘故障模拟, 发现验证机器上没有相关的工具,也无法安装包,之好作罢。怎么办?
喝了一杯茶回来,想到既然是坏盘影响IO, 那么就把有IO的地方mock住!
说干就干,把raft 中和业务中数据流上pwrite/pread的地方都替换成无限sleep, 加个开关,启动后验证了一遍,一切正常,没有复现哪个问题。
后来仔细分析了下,不能一直sleep后,应该用while(1)啊,因为碰到磁盘故障,DIO执行到这里也不会返回,并且不会切换线程。 于是把上面的 sleep换成while。
重新编译执行,打开开关测试 ,还是一切正常啊!
直捣长龙 (pwrite --> sync)
又分析了一遍,既然NVME盘掉线,直接影响的是DIO,那么mock的时候:所有相关的这类操作都应该换成while(1)无法返回,DIO的操作有哪些?
write(O_DIRECT); sync
grep 了一遍,没有O_DIRECT, 只有sync有几个,也换成了while(1), 重新启动,先正常跑了一通,然后把替换sync为 while(1)的开关打开,没过几分钟,就出现了和线上一模一样的假死现象。
根因
仔细分析了下我们的业务,原来在每次元数据更新完都会sync下元数据文件。这个操作在bthread里,为了避免同时操作这个文件,前面有锁。而这个操作又是在一个bthread里, 它做这个又会去拿磁盘基本的锁,这个锁又和很多业务线程互斥!!!
这样一旦这个sync huang住无法返回,就会导致存储进程假死!
总结
通过上面的分享可以看到,分析和模拟磁盘故障,需要知道它的本质影响然后想办法模拟手影响的地方,这样才能彻底定位根因!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
核心特性全新升级!巨杉数据库5.0将正式发布
10月22日,巨杉数据库将正式发布其金融级分布式数据库「SequoiaDB v5.0」。在正式发布前,就让我们一起来尝尝鲜,看看5.0版本将有哪些技术新特性。 作为国内最早布局分布式数据库产品的公司,巨杉数据库自2011年成立起,9年来一直坚持以原生分布式数据库作为核心产品,聚焦于金融业。2017年,巨杉数据库成为首批入选Gartner数据库榜单的国产分布式数据库。 从发布1.0版本至今,已有超百家金融企业对巨杉数据库进行了大规模部署。特别在银行核心系统,巨杉数据库已累计为数百个应用提供高并发零宕机在线数据服务。 此次发布的「SequoiaDB v5.0」主要包括三大核心特性:跨引擎事务一致性、原生分布式金融级容灾、多云多平台开放架构。 「跨引擎事务一致性」 与众多云原生数据库一样,巨杉数据库提供存储计算分离云服务架构,并支持在此架构上构建包括:MySQL、PostgreSQL、Spark等多种数据库引擎。客户可以灵活选择需要的数据库引擎,实现无须代码修改的平滑迁移。 但不同的是,巨杉数据库底层并非构建与一个简单的分布式存储,或计算资源平台。巨杉数据库底层是一个完整的分布式数据库,具备...
- 下一篇
MPLS OPTION A配置原理及数据通信分析
场景描述:as 100和as 300模拟两家公司的自治域系统,现因业务合作需求,两公司需要建设mpls ***实现私网互访,as 567和as 8910模拟ISP,要求ar1 lo0口172.16.1.1和ar3 lo0口172.16.3.3通信。(ar2和ar4同需求) 各广播域网段和地址如图,isp路由器lo0地址以序号编号,如R5 lo0地址为5.5.5.5/32,R6-R10同理;R1-R4 lo0地址分别为172.16.1.1/32,172.16.2.2/32,172.16.3.3/32,172.16.4.4/32. 一、isp内部igp互通1.1、配置所有设备ip地址,如图(具体步骤略)1.2、isp内建立ospf邻居,宣告环回口 R5: ospf 1 router-id 5.5.5.5 area 0.0.0.0 network 5.5.5.5 0.0.0.0 network 56.1.1.5 0.0.0.0 R6: ospf 1 router-id 6.6.6.6 area 0.0.0.0 network 6.6.6.6 0.0.0.0 network 56.1.1.6 ...
相关文章
文章评论
共有0条评论来说两句吧...