问题背景
在特定服务器资源中运行高负载程序
造成NMI watchdog: BUG: soft lockup - CPU#4 stuck for 24s
名词解释
Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题
原因分析
cpu调度器调度一个三方软件介入的驱动程序, 但是该驱动程序存在问题并且没有被监测到, 那么该驱动程序会占用该cpu很长时间导致该cpu没有被执行。linux对于该cpu的监听进程(watchdog/x)长时间监听不到该cpu的状态,监听进程就会抛出一个软死锁(soft lockup)错误,软死锁会挂起cpu使该cpu不可使用。
问题解决
vi /etc/sysctl.conf
#设定当cpu被占用,但是监听进程(watchdog/x)长达30s未监听到该cpu正在执行,则释放该cpu的所有进程。
kernel.watchdog_thresh=30
- sysctl -p
标注
在centos6(2.6内核)中:
softlockup_thresh的值等于内核参kernel.watchdog_thresh,默认60秒;
在centos7(3.10内核)中:
内核参数kernel.watchdog_thresh名称未变,但含义变成了hard lockup threshold,默认10秒;
soft lockup threshold则等于(2*kernel.watchdog_thresh),默认20秒;
3.10内核中 高精度计时器(hrtimer),也就是kernel/watchdog.c: watchdog_timer_fn() 的周期是:softlockup_thresh/5 ,默认4s
如果超过了soft lockup threshold(20s)未更新, 那么就会发生soft lockup。