暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

鲲鹏服务器系统宕机问题报告

IT那活儿 2024-07-08
438
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!



问题现象



在测试环境中,发现一台arm架构服务器操作系统不能登录,随后在次日11时进行重启该操作系统。

通过查看message日志发现没有日志信息,最后报出内核空指针错误,但是没有显示导致空指针的原因。




问题分析



根据message日志信息,分析BMC日志后,找到当时死机状态的信息,发现是inet_sock_destruct,确认问题为网卡协议层问题。

结合之前处理过鲲鹏服务器使用麒麟V10服务器系统,调试过程中发现在系统压力比较大的情况下,容易触发系统宕机这个问题。
经过比较发现,两次出现问题时候报错是一模一样的,可以确认这两次问题出现的原因是相同的
下面附上上次出现问题的分析过程:
1)问题现象
鲲鹏服务器使用麒麟V10服务器系统,调试过程中发现在系统压力比较大的情况下,容易触发系统宕机。通过vmcore文件分析异常时的调用栈,都是在内核网络协议栈释放报文时产生了空指针访问,导致系统宕机重启的现象。
2)问题分析
结合内核源代码和inet_sock_destruct函数的反汇编分析。
反汇编中x19存放的是sk->sk_receive_queue, 通过解析此数据结构,可以看到qlen为0,说明receive队列的内容已经被释放。
由以上分析,队列可能被重复释放,还无法找到第一次释放队列的位置。
增加调试信息:
在上面定位中怀疑报文已经被释放过一次,加上下面的调测补丁,将上一次调用释放skb的堆栈保存到skb的cb中,重新生成vmcore。
在新的vmcore中查找sk_buff 的cb字段,并读取cb内容:
在cb中看到保存栈的调用路径为:
tcp_done–>inet_csk_destroy_sock->sk_stream_kill_queues->kfree_skb->skb_release_all
分析另外一份vmcore,从堆栈信息中可以看到在sk_stream_kill_queues中也报了空指针访问。
通过反汇编sk_stream_kill_queues函数,查看X2寄存器对应的skb内容:
从上面的两个vmcore分析,可以确定有两条路径在同时操作同一个sock的receive队列:




解决办法



分析系统日志和bmc日志,结合之前同样设备的分析过程及结论,该问题为网络协议层问题,需要升级内核至4.19.90-23版本解决,内核添加了解决补丁的patch。

目前arm架构中的hns3和mlx5这两个网卡驱动存在该问题,问题为网络协议层问题,无法通过升级驱动解决,只能升级内核解决。
安装方法:
1)先升级安装依赖包
# rpm -Uvh kernel-core-4.19.90-23.15.v2101.ky10.aarch64.rpm 
kernel-modules-4.19.90-23.15.v2101.ky10.aarch64.rpm kernel-
modules-extra-4.19.90-23.15.v2101.ky10.aarch64.rpm kernel-
modules-internal-4.19.90-23.15.v2101.ky10.aarch64.rpm

2)再安装内核包
# rpm -ivh kernel-4.19.90-23.15.v2101.ky10.aarch64.rpm

END


本文作者:白炀斌(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论