□Raspberry Pi での謎のハングアップ対策(watchdogtimerで再起動)
□Raspberry Pi での謎のハングアップ対策(watchdogtimerで再起動)
表題の通り、Raspberry Pi で動かしているシステムでハングアップが「たまーに」発生するので、どうしたものかと悩んでいた。
本当は根本原因を突き止めたいのだけれど、電源電流の不足とかハード的な要因も少なからず考えられるRaspberry Piなので、
ソフトの対策をあれこれするだけでなく、ハード的に再起動すればシステムとしては稼動し続けるような仕組みにしたい。
幸いにもRaspberry PiにはハードウェアとしてWatchDogTimer(WDT)が組み込まれているので、これを有効にする。
が、どうもぐぐってみるとみんな肝心のハード的なWDTのテストをしていないようなんですが…今回はこれを言いたかった。
ま、使っているOSもpidora/fedoraなので、モジュールの宣言する場所も違ったりするのでこれも合わせてね。
yum -y install watchdog
として、watchdogパッケージをインストールしてから
/etc/modules
/etc/modprobe.d/bcm2708_wdog.conf
/etc/default/watchdog
…これらにモジュールを書いてもだめで、
echo “bcm2708_wdog” | sudo tee /etc/modules-load.d/bcm2708_wdog.conf
これでOK!! 再起動してもちゃんと
> bcm2708_wdog 4082 1
というようにモジュールを読み込んでくれる。
で、肝心の設定だけど、自分は以下を有効にした。
emacs /etc/watchdog.conf
----------
admin = メールアドレス
max-load-1 = 24
watchdog-device = /dev/watchdog
watchdog-timeout = 10
realtime = yes
priority = 1
----------
まぁ実際、いくら「admin = メールアドレス」とか書いても、ハングアップすると
メールとか送ってくれないんだけど、その他のロードアベレージ(とか有効にして
いないけどpingとかメモリとか)で再起動と言う場合には、エラーコードとともに
メールを送ってくれるので便利かも?
「watchdog-timeout = 10」を書かないと
> cannot set timeout 60 (errno = 22 = ‘Invalid argument’)
こんなエラーでwatchdogが起動しない。
で、
systemctl enable watchdog
systemctl start watchdog
systemctl status watchdog -l
として、再起動しても起動するようにして、とりあえず起動したかどうか確認。
> watchdog.service – watchdog daemon
> Loaded: loaded (/usr/lib/systemd/system/watchdog.service; enabled)
> Active: active (running) since Thu 1970-01-01 09:00:22 JST; 45 years 6 months ago
> Process: 245 ExecStart=/usr/sbin/watchdog (code=exited, status=0/SUCCESS)
> Main PID: 256 (watchdog)
> CGroup: /system.slice/watchdog.service
> mq256 /usr/sbin/watchdog
>
> Jan 01 09:00:20 mydns-adapter.local systemd[1]: Starting watchdog daemon…
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: starting daemon (5.13):
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: int=1s realtime=yes sync=no soft=no mla=24 mem=0
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: ping: no machine to check
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: file: no file to check
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: pidfile: no server process to check
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: interface: no interface to check
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: test=none(0) repair=none(0) alive=/dev/watchdog heartbeat=none temp=none to=メールアドレス no_act=no
> Jan 01 09:00:20 mydns-adapter.local watchdog[256]: hardware watchdog identity: BCM2708
> Jan 01 09:00:22 mydns-adapter.local systemd[1]: Started watchdog daemon.
で、本当にWDTが効くのかどうかを試すには、
pkill -9 watchdog
としてwatchdogプロセスを強制終了すると/var/log/messagesに
> wdt: WDT device closed unexpectedly. WDT will not stop!
というようにでて「WDTは止まってねーよ」(=このままだと再起動するよ)と言われて
10秒後にめでたく再起動する。