1 关键字

系统死机;panicreboot;

2 问题描述

系统版本:OpenHarmony 3.2 Release

问题现象:进行稳定性的开关机测试,概率出现开机失败的情况,并且卡死在启动画面。

3 问题原因

正常机制

  系统正常开关机,没有卡死现象。

     异常机制

  开关机测试中,概率出现reboot失败的情况,卡死在启动画面。

4 解决方案

   将内核源代码/drivers/power/reset/sc27xx-poweroff.c修改sc27xx_poweroff_shutdown函数,在系统下电前

   对非bootcpu调用cpu down释放相关资源。

 

 

5 定位过程

  1、通过串口日志查看系统死机时记录的信息。

             

 

    从最后的日志上可以看出死机的大概原因 :内存问题导致内核panic

    进一步由” Out of memory and no killable processes...”看出内核panic是由于内核触发oom,并且无法选出可以杀掉的进程空出内存页。

    向上看panic之前的日志信息可以发现内核短时间内连续触发了2oom

 

    第一次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失败的情况。

   下面是重启时CPU1kill失败的日志:

            

 

  ii 重启失败后出现RCU stalls on CPU,说明CPU3block,并且这种情况一直持续到最后系统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

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐