概念说明linux
Linux内核Lockup就是linux内核占用CPU不放,Lockup分为两种:soft lockup 和 hard lockup。线程
soft lockup是指CPU被内核代码占据,以致于没法执行其它进程。检测soft lockup的原理是给每一个CPU分配一个定时执行的内核线程[watchdog/x],设计
若是该线程在设定的期限内没有获得执行的话就意味着发生了soft lockup,[watchdog/x]是SCHED_FIFO实时进程,优先级为最高的99,拥有优先运行的特权。进程
hard lockup比soft lockup更加严重,CPU不只没法执行其它进程,并且再也不响应中断。检测hard lockup的原理利用了PMU的NMI perf event,get
由于NMI中断是不可屏蔽的,在CPU再也不响应中断的状况下仍然能够获得执行,它再去检查时钟中断的计数器hrtimer_interrupts是否在保持递增,io
若是停滞就意味着时钟中断未获得响应,也就是发生了hard lockup。event
linux内核的代码实如今kernel/watchdog.c中,原理
主体涉及到了3个东西:kernel线程,时钟中断,NMI中断(不可屏蔽中断)。方法
这3个东西具备不同的优先级,依次是kernel线程 < 时钟中断 < NMI中断。im
检测机制
Linux kernel设计了一个检测lockup的机制,称为NMI Watchdog,是利用NMI中断实现的,用NMI是由于lockup有可能发生在中断被屏蔽的状态下,这时惟一能把CPU抢下来的方法就是经过NMI,由于NMI中断是不可屏蔽的。NMI Watchdog 中包含 soft lockup detector 和 hard lockup detector,2.6以后的内核的实现方法以下。
NMI Watchdog 的触发机制包括两部分:
1. 一个高精度计时器(hrtimer),对应的中断处理例程是kernel/watchdog.c: watchdog_timer_fn(),在该例程中:
2.基于PMU的NMI perf event,当PMU的计数器溢出时会触发NMI中断,对应的中断处理例程是 kernel/watchdog.c: watchdog_overflow_callback(),
hard lockup detector就在其中,它会检查上述hrtimer的中断次数(hrtimer_interrupts)是否在保持递增,若是停滞则代表hrtimer中断未获得响应,也就是发生了hard lockup。
参数设定
hrtimer的周期是:softlockup_thresh/5。
NMI perf event是基于PMU的,触发周期(hard lockup threshold)在2.6内核里是固定的60秒,不可手工调整;在3.10内核里能够手工调整,
由于直接对应着内核参数kernel.watchdog_thresh,默认值10秒。
异常处理
检测到 lockup 以后怎么办?能够自动panic,也可输出条信息就算完了,这是能够经过内核参数来定义的:
参考: https://www.kernel.org/doc/Documentation/lockup-watchdogs.txt