Softlockup 檢測器和 Hardlockup 檢測器 (又名 nmi_watchdog)¶
Linux 核心可以充當看門狗,以檢測軟鎖定和硬鎖定。
“軟鎖定 (softlockup)” 定義為導致核心在核心模式下迴圈超過 20 秒(有關詳細資訊,請參閱下面的“實現”),而沒有給其他任務執行機會的錯誤。檢測到時會顯示當前堆疊跟蹤,預設情況下,系統將保持鎖定狀態。或者,可以將核心配置為 panic;為此提供了 sysctl “kernel.softlockup_panic”、核心引數 “softlockup_panic”(有關詳細資訊,請參閱“核心的命令列引數”)和一個編譯選項 “BOOTPARAM_SOFTLOCKUP_PANIC”。
“硬鎖定 (hardlockup)” 定義為導致 CPU 在核心模式下迴圈超過 10 秒(有關詳細資訊,請參閱下面的“實現”),而沒有讓其他中斷有機會執行的錯誤。與軟鎖定的情況類似,檢測到時會顯示當前堆疊跟蹤,並且系統將保持鎖定狀態,除非更改了預設行為,這可以透過 sysctl “hardlockup_panic”、編譯時旋鈕 “BOOTPARAM_HARDLOCKUP_PANIC” 和核心引數 “nmi_watchdog” 來完成(有關詳細資訊,請參閱“核心的命令列引數”)。
panic 選項可以與 panic_timeout 結合使用(此超時透過名稱令人困惑的 “kernel.panic” sysctl 設定),以使系統在指定的時間後自動重啟。
實現¶
軟鎖定和硬鎖定檢測器分別構建在 hrtimer 和 perf 子系統之上。 這樣做的直接結果是,原則上,它們應在存在這些子系統的任何體系結構中工作。
一個週期性的 hrtimer 執行以生成中斷並啟動看門狗作業。 每 “watchdog_thresh”(編譯時初始化為 10,可透過同名 sysctl 配置)秒生成一個 NMI perf 事件,以檢查硬鎖定。 如果系統中任何 CPU 在該時間內未收到任何 hrtimer 中斷,則“硬鎖定檢測器”(NMI perf 事件的處理程式)將生成核心警告或呼叫 panic,具體取決於配置。
看門狗作業在一個停止排程的執行緒中執行,該執行緒在每次排程時更新時間戳。 如果該時間戳在 2*watchdog_thresh 秒(軟鎖定閾值)內未更新,則“軟鎖定檢測器”(在 hrtimer 回撥函式中編碼)會將有用的除錯資訊轉儲到系統日誌,之後,如果指示這樣做,它將呼叫 panic,否則將恢復執行其他核心程式碼。
hrtimer 的週期為 2*watchdog_thresh/5,這意味著它有兩到三次機會在硬鎖定檢測器啟動之前生成中斷。
如上所述,提供了一個核心旋鈕,允許管理員配置 hrtimer 和 perf 事件的週期。 特定環境的正確值是在對鎖定的快速響應和檢測開銷之間的權衡。
預設情況下,看門狗在所有線上核心上執行。 但是,在配置了 NO_HZ_FULL 的核心上,預設情況下,看門狗僅在內務處理核心上執行,而不在 “nohz_full” 啟動引數中指定的核心上執行。 如果我們允許看門狗預設在 “nohz_full” 核心上執行,我們將必須執行定時器滴答來啟用排程程式,這將阻止 “nohz_full” 功能保護這些核心上的使用者程式碼免受核心的影響。 當然,預設情況下在 nohz_full 核心上停用它意味著當這些核心進入核心時,預設情況下我們將無法檢測到它們是否鎖定。 但是,允許看門狗繼續在內務處理(非無滴答)核心上執行意味著我們將繼續在這些核心上正確檢測到鎖定。
在任何一種情況下,都可以透過 kernel.watchdog_cpumask sysctl 調整從執行看門狗中排除的核心集。 對於 nohz_full 核心,這對於除錯核心似乎掛在 nohz_full 核心上的情況可能很有用。