国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
使用 watchdog 構(gòu)建高可用性的 Linux 系統(tǒng)及應(yīng)用

1 Linux對Watchdog的支持

Watchdog在實(shí)現(xiàn)上可以是硬件電路也可以是軟件定時(shí)器,能夠在系統(tǒng)出現(xiàn)故障時(shí)自動(dòng)重新啟動(dòng)系統(tǒng)。在Linux 內(nèi)核下, watchdog的基本工作原理是:當(dāng)watchdog啟動(dòng)后(即/dev/watchdog 設(shè)備被打開后),如果在某一設(shè)定的時(shí)間間隔內(nèi)/dev/watchdog沒有被執(zhí)行寫操作, 硬件watchdog電路或軟件定時(shí)器就會重新啟動(dòng)系統(tǒng)。

/dev/watchdog 是一個(gè)主設(shè)備號為10, 從設(shè)備號130的字符設(shè)備節(jié)點(diǎn)。 Linux內(nèi)核不僅為各種不同類型的watchdog硬件電路提供了驅(qū)動(dòng),還提供了一個(gè)基于定時(shí)器的純軟件watchdog驅(qū)動(dòng)。 驅(qū)動(dòng)源碼位于內(nèi)核源碼樹drivers\char\watchdog\目錄下。

1.2 硬件與軟件watchdog的區(qū)別

  1. 硬件watchdog必須有硬件電路支持, 設(shè)備節(jié)點(diǎn)/dev/watchdog對應(yīng)著真實(shí)的物理設(shè)備, 不同類型的硬件watchdog設(shè)備由相應(yīng)的硬件驅(qū)動(dòng)管理。軟件watchdog由一內(nèi)核模塊softdog.ko 通過定時(shí)器機(jī)制實(shí)現(xiàn),/dev/watchdog并不對應(yīng)著真實(shí)的物理設(shè)備,只是為應(yīng)用提供了一個(gè)與操作硬件watchdog相同的接口。
  2. 硬件watchdog比軟件watchdog有更好的可靠性。 軟件watchdog基于內(nèi)核的定時(shí)器實(shí)現(xiàn),當(dāng)內(nèi)核或中斷出現(xiàn)異常時(shí),軟件watchdog將會失效。而硬件watchdog由自身的硬件電路控制, 獨(dú)立于內(nèi)核。無論當(dāng)前系統(tǒng)狀態(tài)如何,硬件watchdog在設(shè)定的時(shí)間間隔內(nèi)沒有被執(zhí)行寫操作,仍會重新啟動(dòng)系統(tǒng)。
  3. 一些硬件watchdog卡如WDT501P 以及一些Berkshire卡還可以監(jiān)測系統(tǒng)溫度,提供了 /dev/temperature接口。

對于應(yīng)用程序而言, 操作軟件、硬件watchdog的方式基本相同:打開設(shè)備/dev/watchdog, 在重啟時(shí)間間隔內(nèi)對/dev/watchdog執(zhí)行寫操作。即軟件、硬件watchdog對應(yīng)用程序而言基本是透明的。

在任一時(shí)刻, 只能有一個(gè)watchdog驅(qū)動(dòng)模塊被加載,管理/dev/watchdog 設(shè)備節(jié)點(diǎn)。如果系統(tǒng)沒有硬件watchdog電路,可以加載軟件watchdog驅(qū)動(dòng)softdog.ko。

1.3 Linux內(nèi)核中關(guān)于watchdog的配置

在Linux下使用watchdog開發(fā)應(yīng)用之前, 請確定內(nèi)核已經(jīng)正確地配置支持watchdog。內(nèi)核源碼下的drivers/char/watchdog/Kconfig文件提供了各種watchdog配置選項(xiàng)的詳細(xì)介紹。特別指出關(guān)于‘CONFIG_WATCHDOG_NOWAYOUT’選項(xiàng)的配置,從清單1軟件watchdog的模塊信息可以看到,nowayout參數(shù)的缺省值等于‘CONFIG_WATCHDOG_NOWAYOUT’, 如果‘CONFIG_WATCHDOG_NOWAYOUT’選項(xiàng)在內(nèi)核配置時(shí)設(shè)為‘Y’, 缺省情況下,watchdog啟動(dòng)后(即/dev/watchdog被打開后),無論是執(zhí)行close操作還是寫入字符‘V’都不能停止watchdog的運(yùn)行。

清單 1. 軟件watchdog驅(qū)動(dòng)softdog的模塊信息
linux-mach:~ # modinfo softdogfilename:       /lib/modules/2.6.16.21-0.8-smp/kernel/drivers/char/watchdog/softdog.koauthor:         Alan Coxdescription:    Software Watchdog Device Driverlicense:        GPLalias:          char-major-10-130vermagic:       2.6.16.21-0.8-smp SMP 586 REGPARM gcc-4.1supported:      yesdepends:        srcversion:     EAE9E5688843C073B0EF5BCparm:           soft_noboot:Softdog action, set to 1 to ignore reboots, 0 to reboot                     (default depends on ONLY_TESTING) (int)parm:           nowayout:Watchdog cannot be stopped once started                     (default=CONFIG_WATCHDOG_NOWAYOUT) (int)parm:           soft_margin:Watchdog soft_margin in seconds.                     (0<soft_margin<65536, default=60) (int)

1.4 watchdog重啟時(shí)間間隔設(shè)定

在開發(fā)應(yīng)用之前,必須了解所用的watchdog驅(qū)動(dòng)的重啟時(shí)間間隔。各種硬件以及軟件watchdog驅(qū)動(dòng)都設(shè)有一個(gè)缺省的重啟時(shí)間間隔,此重啟時(shí)間間隔也可在加載驅(qū)動(dòng)模塊時(shí)設(shè)置。

從清單1軟件watchdog的模塊信息可以看到,soft_margin參數(shù)代表了softdog.ko的重啟時(shí)間間隔,缺省值是60秒,可以在加載softdog.ko 時(shí)指定重啟時(shí)間間隔, 如 `modprobe softdog soft_margin=100`。

1.5 watchdog啟動(dòng)

各種硬件以及軟件watchdog驅(qū)動(dòng)都為應(yīng)用提供了相同的操作方式。打開/dev/watchdog設(shè)備,watchdog將被啟動(dòng)。如果在指定重啟時(shí)間間隔內(nèi)沒有對/dev/watchdog執(zhí)行寫操作,系統(tǒng)將重啟。

清單 2. 啟動(dòng)watchdog的代碼段
int wdt_fd = -1;wdt_fd = open("/dev/watchdog", O_WRONLY);if (wdt_fd == -1){    // fail to open watchdog device}

1.6 watchdog停止

如果內(nèi)核配置選項(xiàng)‘CONFIG_WATCHDOG_NOWAYOUT’設(shè)為‘Y’, 缺省情況下watchdog啟動(dòng)后不能被停止。 如果模塊的nowayout參數(shù)設(shè)為0, 往/dev/watchdog 寫入字符`V’ 可以使watchdog停止工作??梢詤⒖紖⒖嘉墨I(xiàn)二2.6內(nèi)核源碼drivers\char\watchdog目錄下各種硬件及軟件watchdog驅(qū)動(dòng)的write函數(shù)得到停止watchdog的邏輯, 譬如軟件watchdog驅(qū)動(dòng)softdog.c 中的write函數(shù)。

參考文獻(xiàn)三watchdog daemon源碼 watchdog-5.4.tar.gz的 close_all函數(shù)提供了停止watchdog運(yùn)行的范例。以下是一個(gè)簡單的停止watchdog的代碼段范例:

清單 3. 停止watchdog的代碼段
    if (wdt_fd != -1)    {        write(wdt_fd, "V", 1);        close(wdt_fd);        wdt_fd = -1;    }

1.7 watchdog運(yùn)行

從1.6節(jié)中提到的softdog模塊的write函數(shù)可以看到,在watchdog重啟時(shí)間間隔內(nèi)執(zhí)行寫操作,softdog_keepalive將被調(diào)用,增加定時(shí)器定時(shí)時(shí)間。

所以應(yīng)用在啟動(dòng)watchdog后,必須在重啟時(shí)間間隔內(nèi),周期性地對/dev/watchdog執(zhí)行寫操作才能使系統(tǒng)不被重啟。

參考文獻(xiàn)三watchdog daemon源碼 watchdog-5.4.tar.gz的keep_alive函數(shù)提供了保持watchdog運(yùn)行的范例。以下是一個(gè)簡單的保持watchdog運(yùn)行的代碼段范例:

清單 4. 保持watchdog運(yùn)行的代碼段
    if (wdt_fd != -1)        write(wdt_fd, "a", 1);

2 使用watchdog構(gòu)建高可用性的Linux系統(tǒng)及應(yīng)用

不同的系統(tǒng)與應(yīng)用有自己的監(jiān)控需求,不同的被監(jiān)控對象有相應(yīng)的監(jiān)控方法。下文第一部分介紹了一個(gè)Linux下的開源項(xiàng)目watchdog daemon。 這是一個(gè)系統(tǒng)監(jiān)控的后臺應(yīng)用,通過從配置文件中讀取監(jiān)控對象以及監(jiān)控參數(shù)等信息對系統(tǒng)進(jìn)行內(nèi)存、負(fù)載、進(jìn)程、網(wǎng)絡(luò)等方面的監(jiān)控, 同時(shí)將各種監(jiān)測信息記入系統(tǒng)日志,并能夠在系統(tǒng)重啟之前發(fā)email通知管理員。通過閱讀這個(gè)項(xiàng)目的源碼可以學(xué)習(xí)到:

  1. 如何在一個(gè)系統(tǒng)監(jiān)控程序中使用watchdog,在系統(tǒng)出現(xiàn)故障時(shí)重新啟動(dòng)系統(tǒng),以提高系統(tǒng)的可用性
  2. 常用的被監(jiān)控對象以及相應(yīng)的監(jiān)控方法

當(dāng)Linux用于電信、 嵌入式領(lǐng)域, 一些基于Linux操作系統(tǒng)開發(fā)的服務(wù)應(yīng)用在可用性上有較高的要求,下文第二部分介紹了如何在這種類型的應(yīng)用中加入watchdog機(jī)制以提高應(yīng)用的可用性。

2.1 在監(jiān)控應(yīng)用中加入watchdog以提高系統(tǒng)可用性

watchdog daemon是一個(gè)Linux下使用了watchdog的系統(tǒng)監(jiān)控的后臺應(yīng)用。開發(fā)人員可以下載最新的watchdog_5.4.tar.gz源碼。 參見參考資源下載源碼。

2.1.1 程序框架

Watchdog daemon主程序運(yùn)行流程如下:

  1. 解析命令行輸入,從watchdog.conf 配置文件讀取配置信息,檢測各種配置參數(shù)的有效性。 這些配置信息包括:
    • 被監(jiān)控的對象譬如網(wǎng)絡(luò)接口eth0, 被監(jiān)控進(jìn)程的pid文件如/var/run/syslogd.pid
    • 各種檢測參數(shù)的闕值
    • 用戶提供的修復(fù)程序路徑
    • 用戶提供的測試程序路徑

    如果沒有在配置文件中設(shè)置某些配置信息, 相應(yīng)的檢測將不被執(zhí)行。

  2. 進(jìn)行一系列初始化:
    • 初始化用于檢測網(wǎng)絡(luò)狀態(tài)的套接口
    • 設(shè)置自身為后臺進(jìn)程
    • 打開日志文件,往日志中記入各種配置信息
    • 打開/dev/watchdog設(shè)備啟動(dòng)watchdog
    • 打開proc/下各種狀態(tài)信息文件如/proc/meminfo、 /proc/loadavg
    • 禁止自身被swap出內(nèi)存, 設(shè)置自身的調(diào)度優(yōu)先級(在系統(tǒng)負(fù)載較高時(shí), watchdog 后臺進(jìn)程自身有可能被swap出內(nèi)存,導(dǎo)致不能及時(shí)對/dev/watchdog 執(zhí)行寫操作而使系統(tǒng)重啟)
  3. 進(jìn)入while(1) 主循環(huán), 依次執(zhí)行:?
    • 對/dev/watchdog執(zhí)行寫操作,表明當(dāng)前系統(tǒng)運(yùn)行良好。如果超過一分鐘的時(shí)間間隔沒有對/dev/watchdog執(zhí)行寫操作,系統(tǒng)將會被動(dòng)重啟
    • 進(jìn)行各種檢測,下節(jié)將介紹被各種檢測的對象以及相應(yīng)的檢測方法
    • 睡眠一段時(shí)間,此睡眠時(shí)間在配置文件中設(shè)置。如果睡眠時(shí)間設(shè)置太長,則會出現(xiàn)不必要的重啟;設(shè)置太短,會導(dǎo)致檢測太頻繁,增加系統(tǒng)負(fù)載。
    ?

如果檢測返回錯(cuò)誤, 檢測返回值顯示故障可以修復(fù),同時(shí)配置文件中也設(shè)置了修復(fù)程序, 修復(fù)程序?qū)徽{(diào)用。如果修復(fù)故障失敗,主程序?qū)L試執(zhí)行一系列清理、記載日志、email通知管理員的操作,然后重新啟動(dòng)系統(tǒng)。必須注意的是,當(dāng)檢測發(fā)現(xiàn)錯(cuò)誤時(shí),主程序并不是退出while(1)循環(huán),使/dev/watchdog在1分鐘內(nèi)沒被執(zhí)行寫操作而導(dǎo)致系統(tǒng)被動(dòng)重啟; 而是執(zhí)行一系列操作后主動(dòng)重啟系統(tǒng),這樣既可以記錄下日志信息,email通知管理員,也可以防止系統(tǒng)被動(dòng)重啟導(dǎo)致文件系統(tǒng)損壞。

主程序在主動(dòng)重啟之前, 會執(zhí)行以下一系列操作:

  • 關(guān)閉所有打開的文件
  • 如果sendemail應(yīng)用存在,配置文件中提供了管理員的email地址,將發(fā)封email給管理員通知系統(tǒng)重啟
  • 將重啟信息記入系統(tǒng)日志
  • kill掉所有進(jìn)程
  • 將重啟信息記入wtmp
  • 關(guān)閉accounting,quota,swap?
  • 卸載所有非根文件系統(tǒng)
  • 以只讀方式重新裝載根文件系統(tǒng)
  • 關(guān)閉網(wǎng)絡(luò)接口
  • 重啟系統(tǒng)

從以上程序框架可以看到,監(jiān)控應(yīng)用檢測出系統(tǒng)故障時(shí),在系統(tǒng)可控的狀態(tài)下,應(yīng)用會嘗試主動(dòng)重啟系統(tǒng)。但是通過啟動(dòng)watchdog,能夠在系統(tǒng)不可控,或是監(jiān)控應(yīng)用自身不能正常運(yùn)行時(shí),由watchdog自動(dòng)啟動(dòng)系統(tǒng)。

2.1.2 監(jiān)控對象及監(jiān)控方法

watchdog daemon根據(jù)配置文件對系統(tǒng)進(jìn)行以下類型的監(jiān)控,并將每次檢測的結(jié)果記入系統(tǒng)日志:

  1. 通過打開一個(gè)文件成功與否測試文件表是否已滿
  2. 通過讀取/proc/loadavg 以檢測1、5、15分鐘內(nèi)系統(tǒng)平均負(fù)載是否超過設(shè)定值
  3. 通過讀取/proc/meminfo檢測系統(tǒng)是否還剩下足夠的空閑內(nèi)存
  4. 如果一些硬件watchdog卡提供有溫度傳感器進(jìn)行溫度監(jiān)控,訪問/dev/temperature設(shè)備判斷溫度是否過高
  5. 通過調(diào)用kill (pid, 0)檢測某個(gè)進(jìn)程是否仍在運(yùn)行,如果kill調(diào)用返回為0,則進(jìn)程仍在運(yùn)行, 通過從配置文件中讀取pid文件如/var/run/syslogd.pid來獲取被監(jiān)控進(jìn)程的pid
  6. 通過解析/proc/net/dev 的信息, 查看指定的網(wǎng)絡(luò)接口如eh0的收發(fā)包狀況
  7. 通過往一些IP地址發(fā)包檢測這些IP地址可否被ping通,或是ping廣播地址檢測子網(wǎng)中是否至少一臺機(jī)器可以被ping通
  8. 通過調(diào)用fork、execl執(zhí)行用戶傳遞的測試程序

watchdog daemon提供了一些常用的很有參考價(jià)值的監(jiān)控方法及源碼,開發(fā)人員也可自行設(shè)計(jì)開發(fā)更豐富的監(jiān)控方法對系統(tǒng)進(jìn)行更為細(xì)致、全面的監(jiān)控。

2.2 在服務(wù)應(yīng)用中增加watchdog模塊以提高應(yīng)用的可用性

Linux因?yàn)槠鋸?qiáng)大的功能已成為很多企業(yè)級應(yīng)用的開發(fā)平臺。這些應(yīng)用本身并不是一個(gè)監(jiān)控程序而是一個(gè)管理或服務(wù)程序, 對可用性有較高的要求。通過在這類應(yīng)用中加watchdog模塊, 一方面監(jiān)測系統(tǒng)狀態(tài), 另一方面監(jiān)測此應(yīng)用中其它模塊的工作狀態(tài)。系統(tǒng)出現(xiàn)故障時(shí)能自動(dòng)重啟,因?yàn)閼?yīng)用已加在系統(tǒng)的init.d啟動(dòng)服務(wù)中, 應(yīng)用會隨著系統(tǒng)的啟動(dòng)而啟動(dòng),自動(dòng)提供服務(wù)。

這類服務(wù)應(yīng)用通常是多線程的,甚至是多進(jìn)程的。 加入watchdog機(jī)制的通常作法是在應(yīng)用中加入一個(gè)watchdog線程,此線程主循環(huán)的工作流程與上節(jié)介紹的系統(tǒng)監(jiān)控應(yīng)用的守護(hù)進(jìn)程的主循環(huán)工作流程大致相似。Watchdog線程在進(jìn)入主循環(huán)之前的初始化階段打開/dev/watchdog 啟動(dòng)watchdog, 然后執(zhí)行上節(jié)中提到的while(1)循環(huán)中的操作。

如果此應(yīng)用是多進(jìn)程的,子進(jìn)程的fork可以放在watchdog線程的初始化階段執(zhí)行。 Watchdog線程可以獲得這些子進(jìn)程的pid,從而檢測這些子進(jìn)程的工作狀態(tài)。

Watchdog線程除了可以參照上節(jié)watchdog daemon提供的方法對系統(tǒng)狀態(tài)進(jìn)行監(jiān)控, 還可以通過消息隊(duì)列或套接口與應(yīng)用中的其它線程進(jìn)行通信, 獲得其它線程的工作狀態(tài)。不過這需要在其它子線程中加入與watchdog線程進(jìn)行通信的接口。

參考資料

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
用watchdog 保證服務(wù)器的高可用性
18.3 Heartbeat的組成與原理
嵌入式系統(tǒng)中看門狗的使用總結(jié)
架構(gòu)設(shè)計(jì)-架構(gòu)設(shè)計(jì)原則
Linux網(wǎng)卡驅(qū)動(dòng)程序編寫
KVM架構(gòu)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服