linux 核心筆記之watchdog

2021-07-31 06:00:03 字數 3523 閱讀 6377

簡而言之,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 返回當前程...