自作開発 RaspberryPi Rust
Raspberry Pi 5 で超軽量ダッシュボードを自作した話 ── Rustによる平常時負荷ゼロ設計
自宅で稼働させている Raspberry Pi 5(70番サーバー) は、WordPressやNextcloud、PhotoPrism、AdGuard Homeなど、生活を支える数多くのコンテナをホストしている。
常時稼働のサーバーにシステム監視盤を置く際、一番気になったのが「監視プロセスそのものが常時CPUやディスクI/Oを食い潰す」という本末転倒な事態だった。
そこで、「ブラウザを開いて見ている時だけ動き、普段は完全に沈黙する」 という超省エネ・オンデマンドな監視盤を Rust で自作することにした。
設計の肝:平常時の負荷「完全ゼロ」
今回のダッシュボード「Gonta Command Center」で徹底したのは以下の3点だ。
- シングルバイナリへの全内包
- HTML/CSS/JS をすべて Rust バイナリ内に
include_str!で焼き込み、画面表示時の物理ディスク読み込みすらゼロにした。
- HTML/CSS/JS をすべて Rust バイナリ内に
- Server-Sent Events (SSE) によるオンデマンド通信
- 定期的なバックグラウンドデーモンを走らせず、ブラウザが接続してきた時のみ3秒間隔でカーネル仮想メモリ(
/proc,/sys)からデータを吸い上げる。
- 定期的なバックグラウンドデーモンを走らせず、ブラウザが接続してきた時のみ3秒間隔でカーネル仮想メモリ(
- スマホ画面消灯時の自動休止
- ブラウザの
visibilitychangeイベントを拾い、タブが隠れたりスマホがスリープに入った瞬間にSSEを切断する。
- ブラウザの
[!NOTE] 監視対象となるLVMのSSDキャッシュヒット率(dm-cache)やディスク容量も、初期ロード時やボタン押下時のみオンデマンド取得することで、不要なコマンド実行負荷を徹底排除した。
結果:バイナリわずか2.6MB
ビルドしたバイナリサイズはわずか 2.6MB。メモリフットプリントも数MB程度に収まり、CPU使用率は待機時 0.0% を達成した。
次は、この監視盤から外出先のスマホ経由で Wake-on-LAN を飛ばし、メイン開発PCを指一本で起動・停止できるように連携を進めていく。