2015年5月2日 星期六

Raspberry Pi體驗 :Watchdog(看門狗)


如果負責收集資料的樹莓派突然當機(不論是因為硬體或是軟體等問題),又無法經由網路遠端連線進去看狀況時,唯一的解決辦法就是讓管理者跑到樹莓派旁邊手動重開機,這樣的問題通常是很常見的。 為了避免這種當機後,手動重開機的麻煩,樹莓派的硬體上內建了一個看門狗(watchdog)的功能,它可以自動監控系統的運行狀況,當它發現系統卡在某個工作一直沒辦法跳出時,就會自動將系統重新開機。接下來看看怎麼做吧


  • 載入 watchdog 模組(bcm2708_wdog)

 要使用樹莓派的硬體看門狗,首先啟用 bcm2708_wdog 這個核心模組,編輯 /etc/modules 核心模組設定檔,加入這一行:

  1. Configure loading the module on startup:
  2. pi@raspberrypi ~ $ sudo nano /etc/modules
  3. Add this line at the end: bcm2708_wdog
  4.  如果想要立即啟用,可以執行
    pi@raspberrypi ~ $ sudo modprobe bcm2708_wdog

  •   安裝使用 watchdog 程式

  啟用 Linux 的核心模組之後,執行安裝

pi@raspberrypi ~ $ sudo apt-get install watchdog
  •  設定 watchdog 程式

  安裝好之後,編輯 /etc/watchdog.conf 這個設定檔,首先設定看門狗的設備檔案(device file),將 watchdog-device 註解拿掉:

 watchdog-device = /dev/watchdog

這個設定是用來設定 watchdog 這個軟體程式要監控的 device node,好讓程式可以知道要向誰進行回報,在 Raspberry Pi 裡面,預設的就是 /dev/watchdog

  1.  系統負載(loading)
    您可以設定系統負載的上限值,當 watchdog 發現系統負載超過這個上限值的時候,就會讓系統重新啟動。

    max-load-1 = 24
    max-load-5 = 18
    max-load-15 = 12
    這裡的數值是 /etc/watchdog.conf 的預設值,正常來說如果系統真的當機的話,系統的負載慧遠超過 25,這裡所設定的數值在系統正常的狀況下是不會重新啟動的。當然您可以依照自己的狀況來調整這個上限值。
  2. CPU 溫度
    監控樹莓派的 CPU 溫度,當溫度太高時,則關機:

    temperature-device = /sys/class/thermal/thermal_zone0/temp
    max-temperature = 80000
    /sys/class/thermal/thermal_zone0/temp 中儲存的數值是控樹莓派的 CPU 溫度,單位是攝氏千分之一度,我們這裡設定讓 CPU 在超過攝氏 80ᵒC 時重新啟動。而 watchdog 再溫度達到這個數值的 90%、95% 與 98% 時,也會先發出警告。
  3. 記憶體
    監控記憶體的使用量,當虛擬記憶體(virtual memory)太少時,則重新啟動:

    min-memory = 1
    這裡的記憶體單位是 pages,您可以用 getconf 查看自己系統的 page size 是多大:
    getconf PAGESIZE
    或是
    getconf PAGE_SIZE
    輸出會類似這樣
    4096
    以這個例子來說,一張 page 的大小就是 4096 bytes。
  4. 網路

    監控某個 IP 位址:
    ping = 172.31.14.1
    亦可用廣播位址監控整個 subnet 上的主機(這個要小心使用):
    ping = 172.26.1.255
    監控網路卡式否有流量:
    interface = eth0

  5. 檔案

    監控檔案是否可以正常存取,如果無法存取檔案,則重新啟動:
    file = /var/log/messages
    watchdog 會使用 stat 檢查檔案,如果傳回錯誤的話並不會重新啟動,如果 stat 在呼叫時卡住,超過一分鐘之後 watchdog 才會將系統重新啟動,這個狀況通常會發生 NFS 掛載的檔案系統上。
  6. 管理者 Email

    設定管理者的 Email,讓系統重新啟動或是關機前,以 Email 通知管理者:
    admin = admin@gtwang.org
  7. 即時監控模式

    在負載量比較大的系統中,watchdog 很容易被作業系統搬到記憶體的交換空間(swap),如果來不及搬回記憶體時,很容易造成系統不必要的重新啟動,如果想避免這樣的狀況,可以啟用即時監控模式(realtime),讓 watchdog 常駐在記憶體中:
    realtime = yes 
    
  • 讓系統啟動時自動執行 watchdog

除了讓 kernel 載入 bcm2708_wdog 模組外,我們也需要記得在開機的時候,自動啟動 watchdog 程式,這時候就可以透過 Debian 標準的方式,將 watchdog 程式加入到 init 程式裡面
pi@raspberrypi ~ $ update-rc.d watchdog defaults

若你希望現在開始就啟動 watchdog,則這樣作
pi@raspberrypi ~ $ /etc/init.d/watchdog start

  • 當機測試

安裝好看門狗之後,可以用這個 fork-bombs 測試一下,執行這個指令之後,它會不停重複 fork 出新的行程,造成系統當機:
:(){ :|:& };:

正常來說,執行這個指令稿之後,系統就會馬上當住,您可以透過這個方式測試看門狗是否會讓系統重新啟動。
  • 請不要在一般的 Linux 主機上執行 fork-bombs,它會造成系統當機!
正常在執行 fork-bombs 之後,系統負載會在幾秒之內迅速上升,然後重新開機
!!!!!Ensure that you saved all open data before you run this command! Otherwise they will be lost!

參考資料
  1. http://blog.gtwang.org/iot/raspberry-pi/raspberry-pi-hardware-watchdog/
  2. http://raspberrypi.link-tech.de/doku.php?id=watchdog
  3. http://coldnew.github.io/blog/2013/12/13_b1756.html