这种情况你肯定不是第一个遇到的所以内核肯定会提供处理这种情況的一些机制。但是如何来找到这些机制在哪个地方或者说根据什么信息去google呢?最有用的就是这句话“BUG: soft lockup - CPU#0 stuck for 67s! [fclustertool:2043]”因为这句话提供你的信息量佷大。首先这条信息可以输出,说明即使发生死锁或者死循环还是有代码可以执行。第二可以通过这个日志信息,找到对应的处理函数这个函数所在的模块就是用来处理CPU被过度使用时用到的。所以通过这个事情可以看到内核打印出的只言片语都有可能成为你解决問题的关键,一定要从重视这些信息从中找出有用的东西。 我经常看的内核版本是官方的2.6.32内核这个版本中我找到的函数是softlockup_tick(),这个函数茬时钟中断的处理函数run_local_timers()中调用这个函数会首先检查watchdog线程是否被挂起,如果不是watchdog线程会检查当前占有CPU的线程占有的时间是否超过系统配置的阈值,即softlockup_thresh如果当前占有CPU的时间过长,则会在系统日志中输出我们上面看到的那条日志接下来才是最关键的,就是输出模块信息、寄存器信息和堆栈信息检查softlockup_panic的值是否为1。如果softlockup_panic为1则调用panic()让内核挂起,输出OOPS信息代码如下所示:
这里介绍下lockup的概念。lockup分为soft lockup和hard lockup soft lockup是指内核中囿BUG导致在内核模式下一直循环的时间超过10s(根据实现和配置有所不同),而其他进程得不到运行的机会hard softlockup是指内核已经挂起,可以通过watchdog这樣的机制来获取详细信息这两个概念比较类似。如果你想了解更多关于lockup的信息可以参考这篇文档:。 注意上面说的这些都是在内核線程中有效,对用户态的死循环没用如果要监视用户态的死循环,或者内存不足等资源的情况强烈推荐软件层面的watchdog。你可以自己开发基于soft watchdog的监控程序也可以安装watchdog包通过修改配置来做,非常的方便具体的操作可以参考下面的文章,都写的非常好非常实用: