溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Linux內(nèi)核中Watchdog

發(fā)布時間:2021-11-02 09:50:15 來源:億速云 閱讀:243 作者:柒染 欄目:系統(tǒng)運維

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何理解Linux內(nèi)核中Watchdog,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在Linux內(nèi)核中有三個watchdog,它們都需要被悉心的喂養(yǎng)照料,分別是:

1. /dev/watchdog

2.softlockup檢測機制

3.hardlockup檢測機制

首先看 1./dev/watchdog,此看門狗該怎樣喂養(yǎng)呢,linux內(nèi)核中有一段樣例代碼:

samples/watchdog/watchdog-simple.c // SPDX-License-Identifier: GPL-2.0 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h>  int main(void) {         int fd = open("/dev/watchdog", O_WRONLY);         int ret = 0;         if (fd == -1) {                 perror("watchdog");                 exit(EXIT_FAILURE);         }            while (1) {                 ret = write(fd, "\0", 1);                  if (ret != 1) {                         ret = -1;                          break;                 }                    sleep(10);         }            close(fd);         return ret; }

此例子中,每隔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)濟(jì)瞬間癱瘓。

此時想想看,Linux系統(tǒng)有沒有什么機制來解決這種問題了,這時候“/dev/watchdog" 來了,

這個時候只需要在數(shù)據(jù)庫程序中加上類似上面的樣例程序,每隔10s中就去喂狗一次,

只要數(shù)據(jù)庫程序卡住,卡住之后就不能喂狗了,等到比如默認(rèn)60s以后,這只狗就罷工了,立馬會默認(rèn)觸發(fā)服務(wù)器重啟。

服務(wù)器重啟會重新加載數(shù)據(jù)庫程序,  或者服務(wù)器在重啟過程中,由于服務(wù)器與它所在的服務(wù)器集群失聯(lián),從而觸發(fā)集群中的分腦檢測,把數(shù)據(jù)庫程序挪到集群中其它設(shè)備上跑, 此時就減少了很多損失.  所以這只狗/dev/watchdog 用處太大了。

再來看下它的實現(xiàn)原理:

#ps -ef | grep watchdog root       104     2  0  2020 ?        00:00:00 [watchdogd]  #ls -l /dev/watchdog* crw------- 1 root root  10, 130 Dec 30 20:04 /dev/watchdog crw------- 1 root root 247,   0 Dec 30 20:04 /dev/watchdog0

看到系統(tǒng)中有個內(nèi)核線程watchdogd, 和兩個字符文件:/dev/watchdog和/dev/watchdog0

其中watchdogd實時調(diào)度類線程負(fù)責(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)這個功能:

static int __init softdog_init(void)         hrtimer_init(&softdog_ticktock, CLOCK_MONOTONIC, HRTIMER_MODE_REL);         softdog_ticktock.function = softdog_fire;  static enum hrtimer_restart softdog_fire(struct hrtimer *timer)         emergency_restart();  static int softdog_ping(struct watchdog_device *w)         hrtimer_start(&softdog_ticktock, ktime_set(w->timeout, 0), (60s)                       HRTIMER_MODE_REL);

從代碼實現(xiàn)來看,很好理解,在開啟看門狗(open  "/dev/watchdog")之后,默認(rèn)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每次被喚醒之后都會對某個時間戳進(jìn)行重置。

hardlockup檢測機制的喂狗方式是,hrtimer每次執(zhí)行時都會對一個變量進(jìn)行加一。

關(guān)于softlockup和hardlockup檢測機制的具體原理實現(xiàn)和應(yīng)用場景,我最近發(fā)布了一個視頻“Linux常見鎖和lockup檢查機制"  包含了從實現(xiàn)原理(linux內(nèi)核代碼層)和原理驗證(使用ftrace調(diào)試手段)、樣例代碼、動手模擬實驗,可以全方位理解softlockup/hardlockup.

上述就是小編為大家分享的如何理解Linux內(nèi)核中Watchdog了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI