概念說明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