ドライバーを含むアプリケーションが暴走していないか確認する為、ウォッチドッグタイマーでそのチェックをします。既定では無効化されてるので、有効化する方法を案内します。
ウォッチドッグタイマーの概要
ウォッチドッグタイマーの概要は
いつも、実行優先度の一番低いアイドルループが、一定間隔でウォッチドッグタイマーをリセットしています。
しかし、実行優先度の高いアプリケーションがずーーーーーっとループし続けると、実行優先度の低いアイドルループが動かず、ウォッチドッグタイマーがリセットされません。
ついにウォッチドッグタイマーがタイムアウトしてCPUがリセットされます。
CPUがリセットされることで、サーバが再起動し、正常に稼働し始めます。
ウォッチドッグタイマー(WDT)の有効化
ハードウェアのWDTを有効に
$ sudo vi /boot/firmware/config.txt
ももぶろ
viの超簡単な使い方は、ここを見てね
ファイルに下記行を追加します。
dtparam=watchdog=on
既に定義されていれば、上記内容に変更してください。
bcm2835-wdt(Broadcom)の設定
$ sudo vi /etc/modprobe.d/bcm2835-wdt.conf
ももぶろ
viの超簡単な使い方は、ここを見てね
ファイルに、「5秒間WDTのリセットが無ければCPUをリセット」
options bcm2835_wdt heartbeat=5 nowayout=0
を追加します。
既に定義されていれば、上記内容に変更してください。
Heartbeat間隔をsystemdに設定
$ sudo vi /etc/systemd/system.conf
ももぶろ
viの超簡単な使い方は、ここを見てね
ファイルに「2秒に間隔でWDTをリセット」
RuntimeWatchdogSec=10
RebootWatchdogSec=2min
を追加します。
既に定義されていれば、上記内容に変更してください。
ここでreboot
変更を反映する為ここで再起動します。
$ sudo reboot
WDTの有効化確認
$ dmesg | grep bcm2835-wdt
[ 0.256726] bcm2835-wdt bcm2835-wdt: Poweroff handler already present!
[ 0.256730] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
Heartbeat間隔の設定を確認
$ dmesg | grep systemd | grep watchdog
[ 3.702811] systemd[1]: Using hardware watchdog 'Broadcom BCM2835 Watchdog timer', version 0, device /dev/watchdog0
再起動を確認
この操作で、Kernelがパニックになります。
$ sudo su
# echo c > /proc/sysrq-trigger
ももぶろ
この後Raspberry Piが再起動すれば大丈夫です。お疲れ様です。