前記事でRaspberry Pi Zero 2 Wを使ったGPSビーコン(現在位置を定期的にサーバーに送信する追跡デバイス)を自作した際、ChatGPTさんのアドバイスを元にメモリや消費電力周りを最適化したので覚え書き。OSレベルというか、自作スクリプトと関係ない情報なので別記事にしておきます。
■ROM化
microSDカードのようなフラッシュメモリは書き込み回数により劣化が進むので、通常運用時は書き込みをしないようにします。現在のRaspberry OS 12系はBookwormという世代のDebianベースで、Overlay File Sytemというのを有効化するだけで、メモリ上に仮想ストレージを生成してログなどは全てそちらに書き込み、電源オフですべて消える、という形になります。電源投入毎に真っ新な状態から始まるので、ログが溢れるとかもないし、SDカードの劣化も抑えられるので長期放置運用にはもってこいです。
設定は標準設定コマンドraspi-configで簡単に行えます。
1 |
sudo raspi-config |
「Performance Options」→「Overlay File Systemなんちゃら」でYesで有効化、Noで無効化。続けてbootパーティションも無効化にするか聞かれ、raspi-config終了時に再起動を促されます。
色々設定を変更する時は無効化し、終わったら有効化するのを忘れずに!(有効化したまま設定変更しても再起動で戻ってしまいます)。
現在の状態確認は、
1 |
mount | grep overlay |
として、「overlay on / type overlay (rw,relatime,lowerdir=…,upperdir=…,workdir=…)」みたいなのが出れば有効、なにも出なければ無効です。
■リソースチェック法
諸々最適化を図る前に数値を取って効果検証します。
メモリ使用量
1 |
free -h |
で現在のメモリ総量、残量、スワップ使用状況などが確認できます。
1 2 3 4 |
$ free -h total used free shared buff/cache available Mem: 416Mi 148Mi 185Mi 8.0Ki 131Mi 267Mi Swap: 511Mi 2.8Mi 509Mi |
今回の場合、スタート状態はこんな感じでした。Pi Zero2はメインメモリ512MBですが、GPUメモリに初期状態で64MB割り当てられて目減りしていました。実質の残量が267Mi、スワップがわずか(2.8Mi)に使用されています。最終的にスワップ無効化までもっていきたい。
CPU温度
1 |
vcgencmd measure_temp |
とするとSoC(CPU)温度が出力されます。初期状態で60℃ほどでした。公式の推奨動作温度範囲は0~ 85℃で80℃程度からサーマルスロットリング発動するぽい。まだまだ安全圏ですが、これは室内での数値なので、車内に隠蔽設置した際は夏の気温や暖房の影響で更に上がる可能性もあります。できるだけ下げておきたいところ。
■やったこと
[予習] config.txtの編集方法
以下の設定のいくつかは/boot/firmware/config.txtを編集することで行います。通常は/bootパーティションはro(read only)でマウントされているので、シェルから直接編集はできません。mountコマンドでrwで再マウントするなども可能ではあるんですが、今回はmicroSDをPCにマウントしてルートディレクトリにあるconfig.txtをエディタで編集しました。
GPUメモリ割当を減らす(64GB → 16GB)
現在の割り当ての確認は、
1 |
vcgencmd get_mem gpu |
です。64GBでしたが、GPSロガーではXのようなGUIは使わないので余剰に割り当てされていると言えます。最低の16GBに変更しました。なお実際の使用量をリアルタイムで確認するのはGUIツールが必要っぽいので本末転倒なので断念。どのみち使わなければ発熱にはさほど影響しませんが、メモリをがっつり取り返せるので効果は大きいと思います。
config.txtの[all]セクション辺りに、
1 |
gpu_mem=16 |
と書きます。
動作クロックを制限する(1.2GHz → 1.0GHz)
発熱を抑える施策です。config.txtの「arm_boost=1」の箇所を「arm_boost=0」に書き換えます。
不要なデバイスを無効化する
該当箇所を探してコメントアウト(行頭に#をつける)していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# GPUドライバーオーバーレイ # dtoverlay=vc4-kms-v3d # max_framebuffers=2 # カメラ # camera_auto_detect=1 # DSI接続のモニター(HDMIは無関係) # display_auto_detect=1 # オーディオ # dtparam=audio=on # initramfs(独自のinitrdを使用しなければ不要) # auto_initramfs=1 |
Bluetoothの無効化
いっさい使わないので無効化します。これはコメントアウトではなく、行を追加します。
1 2 3 4 5 |
# Bluetoothを無効化する dtoverlay=disable-bt なお、Bluetoothもシリアルポートの一種なので、無効化するとデバイス番号が詰まるのかシリアルポートの仮想デバイス名がかわってスクリプトがエラーを吐くようになりました。 もともと「/dev/ttyS0」を指定したのを「/dev/ttyAMA0」に変更したら元通り動く様になりました。 |
LEDを無効化
ボード上のLEDを無効化します。どうせ見えないところに隠すし、光ってない方が見付かりにくいでしょう。ただし今回装着したGPSモジュールHAT上のLEDは消えないので気休め程度です。消費電力が1~2mA(全体の1~2%程度)減らせるようです。
これもconfig.txtの[all]ブロックに追加します。
1 2 |
dtparam=act_led_trigger=none dtparam=act_led_activelow=on |
Wi-Fiのパワーセーブを無効化
これは逆に消費電力を増やす措置ですが、通信を安定かさせるためにやってみました。GPSロガーでは一定時間毎にサーバーに現在位置情報を送信しますが、システムが一定時間通信がないとWi-Fiを節電モードにしてしまい、復帰に数秒かかってしまうことがあるということで、それを無効化(=省電力しない)。
現状確認
1 |
iw dev wlan0 get power_save |
で、「Power save: off」とか「Power save: on」とか出ます。
オフにするのは、
1 |
iw dev wlan0 set power_save off |
ですが、システム起動時に自動実行するためには少し操作が必要です。色々方法はありそうですが、とりあえずChatGPTさんに聞いたやり方。
/etc/rc.localに記述。今回は存在していなかったので新規作成しました。
1 2 3 4 |
#!/bin/bash iw dev wlan0 set power_save off exit 0 |
最初と最後の行も必須です。ファイルを作ったら実行可能フラグつけます。
1 2 |
sudo chmod +x /etc/rc.local |
次に、/etc/systemd/system/rc-local.serviceを以下の内容で作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no [Install] WantedBy=multi-user.target |
そしてサービスとして登録。
1 2 |
sudo systemctl enable rc-local sudo systemctl start rc-local |
これで起動の度に無効化されるはずなので、念のため「iw dev wlan0 get power_save」してみましょう。
■ログインメッセージを省略
システムリソースへの影響はほぼないですが、デフォルトのログインメッセージ の「The programs included with the Debian GNU/Linux system are free software;~」みたいな10行くらいの英文がうっとうしいので削除しました。/etc/motdの内容が差し込まれるので、これを空にします(削除ではなく中身を消す)。
■スワップを無効化
あれこれいじったおかげで、メモリ総量が50Miほど増えて、スワップ使用量が0にできました。
1 2 3 4 |
$ free -h total used free shared buff/cache available Mem: 464Mi 152Mi 173Mi 816Ki 189Mi 311Mi Swap: 511Mi 0B 511Mi |
残量も300Mi以上あるのでスワップを無効化してよさそうです。
sudo nano /etc/dphys-swapfileをエディタで編集し、「CONF_SWAPSIZE=0」とします(最初は512とかだった)。その後、
1 2 3 |
sudo dphys-swapfile setup #設定を反映 sudo systemctl disable dphys-swapfile #swapサービス無効化 sudo swapoff -a #スワップ停止 |
とします。free -hを実行して、Swapの行がすべて0になっていれば完了です。
■成果確認
諸々の設定を施して、
- メモリ総量: 416Mi→ 464Miに増加
- メモリ残量: 267Mi → 308Miに増加
- スワップ使用量: 2.8Mi → 0Miでスワップを無効化
- 温度: 60℃超え → 48℃程度に低下
という最適化ができました。消費電力としては測れてないですが、温度が10℃以上下がったのは達成感あります。