背景说明

所谓,soft lockup 就是说,这个 bug 没有让系统彻底死机,但是若干个进程(或者 kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。Linux 内核对于每一个 cpu 都有一个监控进程,在技术界这个叫做 watchdog(看门狗)。通过 ps --ef grep watchdog 能够看见,进程名称大概是 watchdog/X(数字:cpu 逻辑编号 1/2/3/4 之类的)。这个进程或者线程每一秒钟运行一次,否则会睡眠和待机。这个进程运行会收集每一个 cpu 运行时使用数据的时间并且存放到属于每个 cpu 自己的内核数据结构。在内核中有很多特定的中断函数。这些中断函数会调用 soft lockup 计数,他会使用当前的时间戳与特定(对应的) cpu 的内核数据结构中保存的时间对比,如果发现当前的时间戳比对应 cpu 保存的时间大于设定的阀值,他就假设监测进程或看门狗线程在一个相当可观的时间还没有执。Cpu 软锁为什么会产生,是怎么产生的?如果 Linux 内核是经过精心设计安排的 CPU 调度访问,那么怎么会产生 cpu 软死锁?那么只能说由于用户开发的或者第三方软件引入,看我们服务器内核 panic 的原因就是 qmgr 进程引起。因为每一个无限的循环都会一直有一个 cpu 的执行流程(qmgr 进程示一个后台邮件的消息队列服务进程),并且拥有一定的优先级。Cpu 调度器调度一个驱动程序来运行,如果这个驱动程序有问题并且没有被检测到,那么这个驱动程序将会暂用 cpu 的很长时间。根据前面的描述,看门狗进程会抓住(catch)这一点并且抛出一个软死锁(soft lockup)错误。软死锁会挂起 cpu 使你的系统不可用。

解决办法

追加到配置文件中
echo 30 > /proc/sys/kernel/watchdog_thresh

查看

[root@git-node1 data]# tail -1 /proc/sys/kernel/watchdog_thresh

30

临时生效

sysctl -w kernel.watchdog_thresh=30