https://docs.kernel.org/translations/zh_CN/admin-guide/lockup-watchdogs.html
Softlockup與hardlockup檢測(cè)機(jī)制(又名:nmi_watchdog)
Linux中內(nèi)核實(shí)現(xiàn)了一種用以檢測(cè)系統(tǒng)發(fā)生softlockup和hardlockup的看門(mén)狗機(jī)制陈哑。
Softlockup是一種會(huì)引發(fā)系統(tǒng)在內(nèi)核態(tài)中一直循環(huán)超過(guò)20秒(詳見(jiàn)下面“實(shí)現(xiàn)”小節(jié))導(dǎo)致 其他任務(wù)沒(méi)有機(jī)會(huì)得到運(yùn)行的BUG慨丐。一旦檢測(cè)到’softlockup’發(fā)生渗饮,默認(rèn)情況下系統(tǒng)會(huì)打 印當(dāng)前堆棧跟蹤信息并進(jìn)入鎖定狀態(tài)。也可配置使其在檢測(cè)到’softlockup’后進(jìn)入panic 狀態(tài)伦乔;通過(guò)sysctl命令設(shè)置“kernel.softlockup_panic”耗美、使用內(nèi)核啟動(dòng)參數(shù) “softlockup_panic”(詳見(jiàn)Documentation/admin-guide/kernel-parameters.rst)以及使 能內(nèi)核編譯選項(xiàng)“BOOTPARAM_SOFTLOCKUP_PANIC”都可實(shí)現(xiàn)這種配置枯夜。
而’hardlockup’是一種會(huì)引發(fā)系統(tǒng)在內(nèi)核態(tài)一直循環(huán)超過(guò)10秒鐘(詳見(jiàn)”實(shí)現(xiàn)”小節(jié))導(dǎo)致其 他中斷沒(méi)有機(jī)會(huì)運(yùn)行的缺陷堵漱。與’softlockup’情況類(lèi)似,除了使用sysctl命令設(shè)置 ‘hardlockup_panic’莱找、使能內(nèi)核選項(xiàng)“BOOTPARAM_HARDLOCKUP_PANIC”以及使用內(nèi)核參數(shù) “nmi_watchdog”(詳見(jiàn):”The kernel’s command-line parameters“)外酬姆,一旦檢 測(cè)到’hardlockup’默認(rèn)情況下系統(tǒng)打印當(dāng)前堆棧跟蹤信息,然后進(jìn)入鎖定狀態(tài)奥溺。
這個(gè)panic選項(xiàng)也可以與panic_timeout結(jié)合使用(這個(gè)panic_timeout是通過(guò)稍具迷惑性的 sysctl命令”kernel.panic”來(lái)設(shè)置)轴踱,使系統(tǒng)在panic指定時(shí)間后自動(dòng)重啟。
實(shí)現(xiàn)
Softlockup和hardlockup分別建立在hrtimer(高精度定時(shí)器)和perf兩個(gè)子系統(tǒng)上而實(shí)現(xiàn)谚赎。 這也就意味著理論上任何架構(gòu)只要實(shí)現(xiàn)了這兩個(gè)子系統(tǒng)就支持這兩種檢測(cè)機(jī)制。
Hrtimer用于周期性產(chǎn)生中斷并喚醒watchdog線程诱篷;NMI perf事件則以”watchdog_thresh“ (編譯時(shí)默認(rèn)初始化為10秒壶唤,也可通過(guò)”watchdog_thresh“這個(gè)sysctl接口來(lái)進(jìn)行配置修改) 為間隔周期產(chǎn)生以檢測(cè) hardlockups。如果一個(gè)CPU在這個(gè)時(shí)間段內(nèi)沒(méi)有檢測(cè)到hrtimer中 斷發(fā)生棕所,’hardlockup 檢測(cè)器’(即NMI perf事件處理函數(shù))將會(huì)視系統(tǒng)配置而選擇產(chǎn)生內(nèi)核 警告或者直接panic闸盔。
而watchdog線程本質(zhì)上是一個(gè)高優(yōu)先級(jí)內(nèi)核線程,每調(diào)度一次就對(duì)時(shí)間戳進(jìn)行一次更新琳省。 如果時(shí)間戳在2*watchdog_thresh(這個(gè)是softlockup的觸發(fā)門(mén)限)這段時(shí)間都未更新,那么 “softlocup 檢測(cè)器”(內(nèi)部hrtimer定時(shí)器回調(diào)函數(shù))會(huì)將相關(guān)的調(diào)試信息打印到系統(tǒng)日志中迎吵, 然后如果系統(tǒng)配置了進(jìn)入panic流程則進(jìn)入panic,否則內(nèi)核繼續(xù)執(zhí)行针贬。
Hrtimer定時(shí)器的周期是2*watchdog_thresh/5击费,也就是說(shuō)在hardlockup被觸發(fā)前hrtimer有 2~3次機(jī)會(huì)產(chǎn)生時(shí)鐘中斷。
如上所述,內(nèi)核相當(dāng)于為系統(tǒng)管理員提供了一個(gè)可調(diào)節(jié)hrtimer定時(shí)器和perf事件周期長(zhǎng)度 的調(diào)節(jié)旋鈕桦他。如何通過(guò)這個(gè)旋鈕為特定使用場(chǎng)景配置一個(gè)合理的周期值要對(duì)lockups檢測(cè)的 響應(yīng)速度和lockups檢測(cè)開(kāi)銷(xiāo)這二者之間進(jìn)行權(quán)衡蔫巩。
默認(rèn)情況下所有在線cpu上都會(huì)運(yùn)行一個(gè)watchdog線程。不過(guò)在內(nèi)核配置了”NO_HZ_FULL“的 情況下watchdog線程默認(rèn)只會(huì)運(yùn)行在管家(housekeeping)cpu上,而”nohz_full“啟動(dòng)參數(shù)指 定的cpu上則不會(huì)有watchdog線程運(yùn)行圆仔。試想垃瞧,如果我們?cè)试Swatchdog線程在”nohz_full“指 定的cpu上運(yùn)行,這些cpu上必須得運(yùn)行時(shí)鐘定時(shí)器來(lái)激發(fā)watchdog線程調(diào)度坪郭;這樣一來(lái)就會(huì) 使”nohz_full“保護(hù)用戶程序免受內(nèi)核干擾的功能失效个从。當(dāng)然,副作用就是”nohz_full“指定 的cpu即使在內(nèi)核產(chǎn)生了lockup問(wèn)題我們也無(wú)法檢測(cè)到歪沃。不過(guò)嗦锐,至少我們可以允許watchdog 線程在管家(non-tickless)核上繼續(xù)運(yùn)行以便我們能繼續(xù)正常的監(jiān)測(cè)這些cpus上的lockups 事件。
不論哪種情況都可以通過(guò)sysctl命令kernel.watchdog_cpumask來(lái)對(duì)沒(méi)有運(yùn)行watchdog線程 的cpu集合進(jìn)行調(diào)節(jié)绸罗。對(duì)于nohz_full而言,如果nohz_full cpu上有異常掛住的情況意推,通過(guò) 這種方式打開(kāi)這些cpu上的watchdog進(jìn)行調(diào)試可能會(huì)有所作用。