linux 内核出现CPU 死机

时间:2022-05-16 08:53:51

linux 异常分析工具(一)

linux 内核OOPS(二)

linux 内核出现死机

产生linux kernel死机原因有硬件引起,有驱动本身错误,有调试函数不合规定

       (1)watchdog 检测lockup 异常

Linux 正常情况下, 一个CPU 参与到系统之中后, 会创建一个watchdog 内核进程用于检测CPU 的运行情况, 可以通过以下命令查看到进程:    

# ps auxf | grep "watchdog"
11 root [watchdog/0]
12 root [watchdog/1]
17 root [watchdog/2]
22 root [watchdog/3]
821 root grep watchdog

可以看到, 每个CPU核都有一个watchdog 进程, 后缀代表CPU 号. 此进程用于维护每个CPU 的全局变量watchdog_touch_ts, 然后再建立一个定时器用于检测这个全局变量是
否更新了, 具体实现在kernel/watchdog.c 代码中.

static void watchdog_prepare_cpu(int cpu)
{
struct hrtimer *hrtimer = &per_cpu(watchdog_hrtimer, cpu);
WARN_ON(per_cpu(softlockup_watchdog, cpu));
hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
hrtimer->function = watchdog_timer_fn;
}
这类问题的现象如图1, 图1 所示一样. 在图3-4 中的现象是soft lockup. 从下
面的信息来看, 有当前CPU 正在运行的进程swapper/0:1, 出错的是CPU1, 同时还打印
超时的时间, 即已经超过多久没有更新watchdog 的值了, 而接着就是出错CPU 的调用栈.


linux 内核出现CPU 死机

                                                              图 1    softlookup 出错类型


linux 内核出现CPU 死机

           图 2   hardlookup 出错类型