MECHATRAXのブログ
弊社製品やサービスに関するブログです。企画や開発の際の参考になれば幸いです。
slee-Pi 3のWatchdog timerでラズパイのプロセス監視【OOMから復帰】
slee-Pi 3のWatchdog timerでラズパイのプロセス監視【OOMから復帰】
【2025年10月追記】
本ブログは、2025年10月に下記環境にて動作確認済みです。
sleepi3-bookworm-lite-arm64-20250520.md
今回は slee-Pi 3 のウォッチドッグタイマでプロセス監視を行います。
本製品のメリット 自動ハードウェアリセット ができる機能を活用します。
ハード異常でも slee-Pi 3 ならクリーンな状態で復帰できます。
ソフトウェアウォッチドッグタイマではどうしようもない時に有用です。
[関連ブログ]
slee-Pi 3 のウォッチドッグタイマを利用したプロセス監視シリーズ
【OOM 状態からの即時復帰】← 本ブログ
【正常動作検知による監視】
【異常動作検知による監視】
【異常動作検知-実装編】
[目的と方法]
目的:異常事態からの即時復帰
方法:slee-Pi 3 のウォッチドッグタイマがハートビート信号を監視する仕組みを利用
意図的に OOM(Out Of Memory) を起こしてプロセス監視機能によるハードウェア再起動を再現する
[環境]
・ラズベリーパイ 3B
・Raspberry Pi OS Lite Legacy (Buster)
・slee-Pi 3
[事前準備]slee-Pi 3 セットアップ
slee-Pi 3 のセットアップ時に sleepi3-utils を必ずインストールしてください。
セットアップ詳細は こちら
[手順1]既存サービスファイルの作成
sleepi3-utils に含まれる sleepi3-heartbeat.service では、プロセスが kill されやすいように Nice=19 , OOMScoreAdjust=1000 で設定されています。
これは、OOM 時にハートビートを優先的に kill させ、プロセス監視機能(ウォッチドッグタイマ)で再起動させるために必要な設定です。
[Unit]
Description=sleepi3 software heartbeat
DefaultDependencies=no
After=sysinit.target
[Service]
Type=simple
Nice=19
OOMScoreAdjust=1000
Environment=LED_PATH=/sys/class/leds/sleepi:led0
ExecStart=/usr/lib/sleepi3-utils/heartbeat.py
[Install]
WantedBy=sysinit.target
サービスファイルの詳細は下記コマンドなどでご確認ください。
man systemd.service
[手順4]OOM Killer 発生用プログラム作成
こちら のブログを参考に oom.c を作成します。
※ コード中に (&t) のような HTML エンティティが含まれています。コードを使用する際は該当部分を取り除いてご利用ください。
[手順3]復帰確認
先ほど作成した oom.c をコンパイル後、実行します。
OOM 状態になると slee-Pi 3 のハートビート(LED1 の点滅)が途絶える様子を確認できます。
途絶えてから60秒後に再起動を始め、正常に起動すれば異常状態からの復帰は成功です。
※ slee-Pi 3 セットアップ時のハートビート監視時間は60秒です。詳細は こちら の HEARTBEAT_TIMEOUT を確認ください。
再起動後、下記コマンドで再起動要因を確認してください。watchdog であれば正しくハードウェアリセットできています。
$ sleepi3ctl get wakeup-flag
watchdog
sleepi3ctl コマンド詳細は こちら
[まとめ]
今回は slee-Pi 3 のプロセス監視機能による即時復帰を行いました。
ウォッチドッグタイマのおかげで自動ハードウェアリセットができ、異常が起きてもクリーンな状態で復帰ができます。
[補足]ハードウェアリセットがうまく機能しない場合
カーネルの OOMK やスワップメモリにより OOM Killer 発生用プログラムが意図しない動作をしている可能性があります。以下のようにスワップメモリを無効化し、OOMK 発生用プログラムが生き残るようにしてください。
スワップメモリ無効化
$ sudo bash -c "echo 1 > /proc/sys/vm/overcommit_memory"
$ cat /proc/sys/vm/overcommit_memory
1
$ sudo swapoff -a
OOMK プログラム生存設定
$ sudo nice -n -20 oom
$ Ctrl + Z で一時的に停止
$ sudo bash -c 'echo -1000 > /proc/$(pidof oom)/oom_score_adj'
$ fg
sudo nice -n -20 oom

