🍓

RO化したRPi3A+でアプリを快適に動かす方法

2023/04/15に公開

メモリが足りない

RO化したRPi3A+はデフォルトではアプリが利用できるメモリは180MB程度になってしまいヘビーなアプリケーションを動かすには少し不足しがちです。

Raspberry pi OS 64bit Liteでofflineかつheadlessで動かすことを前提とします。

Before

吊るしでRO化 -> 利用可能領域:181MB

pi@rpi:~ $ free -h
               total        used        free      shared  buff/cache   available
Mem:           419Mi        63Mi        93Mi       121Mi       262Mi       181Mi
Swap:             0B          0B          0B
pi@rpi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
~
overlay         210M  122M   89M  58% /
~

After

対処してRO化 -> 利用可能領域:339MB

pi@rpi:~ $ free -h
               total        used        free      shared  buff/cache   available
Mem:           467Mi        60Mi       108Mi        13Mi       298Mi       339Mi
Swap:             0B          0B          0B
pi@rpi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
~
overlay         100M   13M   88M  13% /
~

対処

overlay領域削減

まず、overlay分として確保される領域を減らします。デフォルトでは総メモリ量の半分が割り当てられますが、RO化するようなアプリでは書き込み領域はそこまで必要ではないので100MBに減らします。

/usr/bin/raspi-config
- mount -t tmpfs tmpfs /upper
+ mount -t tmpfs -o size=100M tmpfs /upper

swap無効化

swapを無効化しないと、RO化した際のoverlay領域がswap file(/var/swap)に占有されてしまいます。デフォルトでは100MBに設定されているので、貴重なoverlay領域が100MB無駄になってしまいます。

sudo sed -i -e "s/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE=0/g" /etc/dphys-swapfile

gpuメモリ削減

headless運用においてはgpuメモリは必要ないので、限界まで減らします。

sudo raspi-config nonint do_memory_split 16

不要サービス停止

アプリによって変動しますので、適宜停止するサービスを選定してください。

sudo systemctl disable rsyslog.service
sudo systemctl disable polkit.service
sudo systemctl disable ModemManager.service

RO化

sudo raspi-config nonint enable_overlayfs
sudo systemctl reboot

結論

このようにすれば、RPi3A+の利用可能メモリが181MB->339MBに増え、Overlayとしての書き込み可能領域も89M->88Mと同容量を確保出来ます。

参考

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_free_memory_disable_service/
https://lab.seeed.co.jp/entry/2022/04/05/120000

Discussion