在Linux內(nèi)核中有三個watchdog(看門狗),它們都需要被悉心的喂養(yǎng)照料,分別是:
1. /dev/watchdog
2.softlockup檢測機制
3.hardlockup檢測機制
首先看 1./dev/watchdog,此看門狗該怎樣喂養(yǎng)呢,linux內(nèi)核中有一段樣例代碼:

此例子中,每隔10秒鐘就會向“/dev/watchdog"文件寫入0, 這就是喂狗過程,看到這個樣例,好像不太能感受到這個看門狗大的用處,但是放在實際工程中,用處太大了,舉個例子:
某國中央銀行在一臺有 內(nèi)存4T, 320個cpu核 的Linux服務(wù)器上跑一個數(shù)據(jù)庫程序,數(shù)據(jù)庫上存有他本國所有人民的銀行賬號信息,當(dāng)此數(shù)據(jù)庫程序在運行過程中,發(fā)生了IO讀寫錯誤,或者程序bug, 一下卡住了,那么他本國人民就都不能存錢取錢轉(zhuǎn)賬了,整個國民經(jīng)濟瞬間癱瘓。
此時想想看,Linux系統(tǒng)有沒有什么機制來解決這種問題了,這時候“/dev/watchdog" 來了,
這個時候只需要在數(shù)據(jù)庫程序中加上類似上面的樣例程序,每隔10s中就去喂狗一次,
只要數(shù)據(jù)庫程序卡住,卡住之后就不能喂狗了,等到比如默認60s以后,這只狗就罷工了,立馬會默認觸發(fā)服務(wù)器重啟。
服務(wù)器重啟會重新加載數(shù)據(jù)庫程序, 或者服務(wù)器在重啟過程中,由于服務(wù)器與它所在的服務(wù)器集群失聯(lián),從而觸發(fā)集群中的分腦檢測,把數(shù)據(jù)庫程序挪到集群中其它設(shè)備上跑,此時就減少了很多損失.所以這只狗/dev/watchdog 用處太大了。
再來看下它的實現(xiàn)原理:

看到系統(tǒng)中有個內(nèi)核線程watchdogd, 和兩個字符文件:/dev/watchdog和/dev/watchdog0
其中watchdogd實時調(diào)度類線程負責(zé)具體執(zhí)行喂狗,/dev/watchdog是內(nèi)核提供給用戶層的通用操作接口文件,用來開啟這只狗,喂狗,查詢狀態(tài)等。/dev/watchdog0 是具體的狗子實現(xiàn),可以基于具體的物理設(shè)備實現(xiàn),或者是softdog內(nèi)核模塊以軟件的方式(具體使用方法:modprobe softdog)模擬硬件實現(xiàn)。
來看下softdog內(nèi)核模塊怎樣模擬硬件實現(xiàn)這個功能:

從代碼實現(xiàn)來看,很好理解,在開啟看門狗(open "/dev/watchdog")之后,默認60s以后就會觸發(fā)系統(tǒng)重啟,在60s倒計時過程中,只有喂狗(softdog_ping)一次,它就又會恢復(fù)到60s以后才會觸發(fā)系統(tǒng)重啟,所以只要一直喂狗,emergency_restart()就不會執(zhí)行,系統(tǒng)就不會重啟。
再來看下2.softlockup檢測機制 和 3.hardlockup檢測機制。
softlockup檢測機制的喂狗方式是,每cpu上的hrtimer會喚醒一個migration/N內(nèi)核線程,migration/N每次被喚醒之后都會對某個時間戳進行重置。
hardlockup檢測機制的喂狗方式是,hrtimer每次執(zhí)行時都會對一個變量進行加一。
關(guān)于softlockup和hardlockup檢測機制的具體原理實現(xiàn)和應(yīng)用場景,我最近發(fā)布了一個視頻“Linux常見鎖和lockup檢查機制"包含了從實現(xiàn)原理(linux內(nèi)核代碼層)和原理驗證(使用ftrace調(diào)試手段)、樣例代碼、動手模擬實驗,可以全方位理解softlockup/hardlockup.
責(zé)任編輯:lq
-
Linux
+關(guān)注
關(guān)注
88文章
11760瀏覽量
219032 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73965 -
Watchdog
+關(guān)注
關(guān)注
0文章
12瀏覽量
9731
原文標題:總結(jié)Linux內(nèi)核中watchdog
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計時?
深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價值
深度解析ES8389/ES8390/音頻芯片Linux驅(qū)動(Linux6.1內(nèi)核)
內(nèi)核配置項引發(fā)網(wǎng)絡(luò)性能下降的深度剖析
Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實戰(zhàn)指南
【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀內(nèi)核處理的核心輔助函數(shù)
Linux內(nèi)核printk日志級別全解析:從參數(shù)解讀到實操配置
RK3568運行linux卡死,串口無輸出
RK3506開發(fā)板Xenomai內(nèi)核RT-Linux實時性系統(tǒng)適配教程與性能實測,實測僅7μs穩(wěn)定延時
怎么結(jié)合嵌入式,Linux,和FPGA三個方向達到一個均衡發(fā)展?
如何配置和驗證Linux內(nèi)核參數(shù)
樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內(nèi)核的延遲測試
Linux內(nèi)核中有三個watchdog
評論