簡而言之,watchdog是為了保證系統正常執行,或者從死迴圈,死鎖等一場狀態退出的一種機制。
看門狗分硬體看門狗和軟體看門狗。硬體看門狗是利用乙個定時器電路,其定時輸出連線到電路的復位端,程式在一定時間範圍內對定時器清零(俗稱「餵狗」),因此程式正常工作時,定時器總不能溢位,也就不能產生復位訊號。如果程式出現故障,不在定時週期內復位看門狗,就使得看門狗定時器溢位產生復位訊號並重啟系統。軟體看門狗原理上一樣,只是將硬體電路上的定時器用處理器的內部定時器代替,這樣可以簡化硬體電路設計,但在可靠性方面不如硬體定時器,比如系統內部定時器自身發生故障就無法檢測到。
軟體看門狗分為兩種,用於檢測soft lockup的普通軟狗(基於時鐘中斷),以及檢測hard lockup的nmi狗(基於nmi中斷)。
注1:時鐘中斷優先順序小於nmi中斷
注2:lockup,是指某段核心**佔著cpu不放。lockup嚴重的情況下會導致整個系統失去響應。
soft lockup 和 hard lockup,它們的唯一區別是 hard lockup 發生在cpu遮蔽中斷的情況下。
軟狗
單個cpu檢測線程是否正常排程。
一般軟狗的正常流程如下(假設軟狗觸發的時間為20s)
可能產生軟狗的原因:
1.頻繁處理硬中斷以至於沒有時間正常排程
2.長期處理軟中斷
3.對於非搶占式核心,某個執行緒長時間執行而不觸發排程
4.以上all
單個cpu檢測中斷是否能夠正常上報
當cpu處於關中斷狀態達到一定時間會被判定進入hard lockup
nmi檢測流程:
可能產生nmi狗的原因:
1.長期處理某個硬中斷
2.長時間在禁用本地中斷下處理
nmi狗機制也是用乙個percpu的hrtimer來餵狗,為了能夠及時檢測到hard lockup狀態,在比中斷優先順序更高的nmi上下文進行檢測。
硬狗
用於檢測所有cpu是否正常執行
任何乙個cpu都可以喂硬狗,當在一定時間內沒有核餵狗,觸發硬狗復位
硬狗檢測流程:
可能產生硬狗的原因:
1.cpu(沒有軟狗,nmi狗觸發條件)全部掛死
2.cpu之間存在硬體依賴關係,某乙個cpu掛死,有軟體層面的共享資源
基於核心**watchdog.c分析soft lockup以及hard lockup的實現機制(kernel/watchdog.c)
soft lockup
每乙個cpu上都有乙個watchdog執行緒(執行緒名為watchdog/0,watchdog/1 …)
static struct smp_hotplug_thread watchdog_threads = ;
2.該執行緒定期呼叫watchdog函式
static void __touch_watchdog(void)
static void watchdog(unsigned int cpu)
3.時間中斷
static
void watchdog_enable(unsigned int cpu)
}
該函式主要功能就是初始化乙個高精度timer,喚醒watchdog 餵狗執行緒。
hrtimer的時間處理函式為:
static
enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
return hrtimer_restart;
}//檢查搶占被關閉的時間間隔
//watchdog kthread在watchdog timer的中斷上下文中被喚醒,
//當中斷退出時,kthread會搶占cpu上的當前程序。如果
//搶占被關閉的話,則不會發生搶占,watchdog便無法更新時
//間戳,當搶占關閉的時間超過閾值時,核心認為發生了soft
//lock up。
//注:soft lockup閾值 watchdog_thresh * 2 (20s)
3.2static
int is_softlockup(unsigned
long touch_ts)
函式主要任務:
(1)獲取watchdog上次執行的時間戳
(2)遞增watchdog timer執行次數
(3)檢查watchdog時間戳,是否發生了soft lockup(如果發生了,dump堆疊,列印資訊)
(4)重排程timer
lockup 檢測函式:
static
int is_softlockup(unsigned
long touch_ts)
hard lockuphard lock主要在nmi中斷中就行檢測
1.初始化並使能hard lockup檢測
static
int watchdog_nmi_enable(unsigned int cpu)
perf_event_create_kernel_counter函式主要是註冊了乙個硬體的事件。
這個硬體在x86裡叫performance monitoring,這個硬體有乙個功能就是在cpu clock經過了多少個週期後發出乙個nmi中斷出來。
2.當cpu全負荷跑完20秒後,就會有乙個nmi中斷發出,對應watchdog_overflow_callback。
static
void watchdog_overflow_callback(struct perf_event *event,
struct perf_sample_data *data,
struct pt_regs *regs)
return;
}
檢測是否有hard lockup
static
int is_hardlockup(void)
關閉hard lockup檢測
static
void watchdog_nmi_disable(unsigned int cpu)
return;
}
Linux 小命令之 watch
from watch 是乙個非常實用的命令,基本所有的 linux 發行版都帶有這個小工具,如同名字一樣,watch 可以幫你監測乙個命令的執行結果,省得你一遍遍的手動執行。舉例來說,linux 系統有乙個基礎命令 w,可以顯示當前的 uptime 負載還有登入的使用者,非常方便,但是如果我想監測這...
linux 核心 筆記
1 在i2c驅動模組中定義實際呼叫的函式 void read i2cinfo from proc void 2 在i2c模組 如i2c演算法驅動模組 初始化時建立乙個proc entry create proc read entry readi2cinfo 0,0,read i2cinfo from...
Linux筆記(四) Linux核心
2 檔案系統 2.2 檔案系統 處於執行期的程式及其所包含 的總稱。獲取程序識別符號的系統呼叫。函式原型 include include pid t getpid void 返回當前程序的pid pid t getppid void 返回父程序的pid uid t getuid void 返回當前程...