开关机测试中的系统卡死问题的分析报告
关键字 系统死机;panic;reboot; 问题描述 系统版本:OpenHarmony 3.2 Release 问题现象:进行稳定性的开关机测试,概率出现开机失败的情况,并且卡死在启动画面。 问题原因 正常机制系统正常开关机,没有卡死现象。异常机制开关机测试中,概率出现reboot失败
1 关键字
系统死机;panic;reboot;
2 问题描述
系统版本:OpenHarmony 3.2 Release
问题现象:进行稳定性的开关机测试,概率出现开机失败的情况,并且卡死在启动画面。
3 问题原因
正常机制
系统正常开关机,没有卡死现象。
异常机制
开关机测试中,概率出现reboot失败的情况,卡死在启动画面。
4 解决方案
将内核源代码/drivers/power/reset/sc27xx-poweroff.c修改sc27xx_poweroff_shutdown函数,在系统下电前
对非boot的cpu调用cpu down释放相关资源。
5 定位过程
1、通过串口日志查看系统死机时记录的信息。
从最后的日志上可以看出死机的大概原因 :内存问题导致内核panic。
进一步由” Out of memory and no killable processes...”看出内核panic是由于内核触发oom,并且无法选出可以杀掉的进程空出内存页。
向上看panic之前的日志信息可以发现内核短时间内连续触发了2次oom。
第一次kthreadd进程调用__alloc_pages_nodemask申请内存页时,由于内存不足触发oom调用out_of_memory函数。
out_of_memory函数会对每个进程打分,选取打分最高的进程udevd (pid 1673)进程杀掉。
过了58秒钟后, kworker/0:0进程第二次触发了oom:
由日志中的调用栈信息可以看出,此时kworker/0:0进程调用__get_free_pages申请可用的内存页,由于系统内存
不足触发了oom,调用out_of_memory函数来选择一个进程杀掉,让出内存空间使系统能够正常运行下去。
此时out_of_memory函数因为无法选择出可以杀掉的进程而导致系统panic。因为没有配置
panic后重启,使系统一直处于panic状态,设备就呈现出黑屏卡死的现象。
2、以上找到了系统卡死的直接原因,这里是进行开关机的测试,系统会间隔几分钟就进行reboot操作,
为什么会因为内存不足而卡死?这里还要继续搜索日志找到系统重启的日志,看看reboot过程出现了
什么问题。
i 找到系统最后一次reboot的日志。
因为是连续进行开关机的操作,日志中有多次reboot的记录,找到最后一次reboot的日志。
Reboot异常日志:
Reboot正常日志:
对比reboot成功的日志,会发现系统在reboot时会有” Disabling non-boot CPUs ...”日志,是在重启前
停止除CPU0外的其他CPU,这一步工作完成后系统就正常重启了。而reboot失败的日志缺少了
” CPU3 killed.”的日志。
多次复现该问题,从多份问题日志上看,当reboot失败时CPU1~CPU3都可能出现kill失败的情况。
下面是重启时CPU1上kill失败的日志:
ii 重启失败后出现RCU stalls on CPU,说明CPU3被block,并且这种情况一直持续到最后系统panic。
从最后一次reboot失败到系统panic中间有9个小时,这段时间CPU1,CPU2已经下线,而CPU3则一直
被block。
3、对比多份日志,发现每次重启前都调用了sc27xx_poweroff_shutdown函数,该函数在系统showdown时调用,
将而非boot CPU下线。因为CPU3下线时被block,而导致shutdown过程中断、系统卡死,直到最后系统panic。
6 知识分享
1、系统重启就是先完成下电再上电的过程,下电前先停止非boot CPU释放资源。
2、内核的oom机制会在没有空闲的内存页可以分配时触发,按照策略kill掉某个进程,当策略无法选出进程时,
系统就会panic。
更多推荐
所有评论(0)