Raspberry Pi 3B+でzramを用いてメモリ拡張をやってみた際のメモ


※ 当ページには【広告/PR】を含む場合があります。
2020/01/20




zramを用いれば、Raspberry Pi 3B+(以降ラズパイ)の1GBメモリを、物理的な手段で拡張することなしに、もっとメモリ大きくした感じにできるようです。

zramはLinuxカーネル準規のサブシステムのひとつ であり、パッケージインストールをしてラズパイに導入するものではないので、設定にはちょいとクセがあります。 著者は、この手順をついつい「アレ…zramってどうやって使うんだっけ」とド忘れするため、ここいらで色々とまとめようと思います。


zram



公式の
zram: Compressed RAM based block devices から抜粋しますと、

            The zram module creates RAM based block devices named /dev/zram<id> (<id> = 0, 1, …).
Pages written to these disks are compressed and stored in memory itself.
These disks allow very fast I/O and compression provides good amounts of memory savings.

        

と説明があります。
どうやらzramは
/dev/zram0 ...のような名前でRAMのようなブロックデバイスを作ってくれて、それがいい感じのメモリとして機能するようです。
こんな素敵なzramですが、ラズパイで使うには初回には手動で立ち上げるしかありません。
またzramは、物理RAMが不足している場合に、LinuxカーネルがSSDなどのボリューム上にRAMとして機能させるブロック領域を割り当てる、仮想メモリ領域(ページファイル)の技術です。
基本的には物理RAMと比較して、アクセス速度とパフォーマンスはかなり低速なため、zramを乱用すると顕著なパフォーマンス低下を引き起こすようです。
さらに、勝手に仮想メモリ領域を書き換えたり、削除してしまうと、無用なエラーやシステム不安定に陥る危険性もあります。
...何を言いたいかといいますと、
zramをご利用される場合はユーザーの自己責任 となります。
zramは一つの救済措置であり、本当にメモリ不足が深刻なほどの事態になったら、おとなしくラズパイ4Bを購入を検討されたほうが賢明です。


zram.ko



まずはお手元のラズパイ環境で、
zram が動作するかを確認しましょう。

            $ ls /lib/modules/{カーネルで一番新しいバージョンのフォルダ}/kernel/drivers/block/zram
zram.ko

        

この
zram.ko が入っていたら zram が利用できます。

合同会社タコスキングダム|蛸壺の技術ブログ


…最新のカーネルに入ってればいいようですが、とりあえず歴代のカーネルにもちゃんと入っているのが確認できます。


デーモン起動スクリプト



次に手動で毎回起動するわけにもいかないので、起動用のデーモンスクリプトを作成しましょう。
このスクリプトは既に
ここに公開して頂いてあるもの を利用させていただきます。
以下のようにcurlで取得するか、

            curl -O http://sstea.blog.jp/raspi/script/zram.sh

        

もしくはファイルを
zram.sh と名前をつけて新規作成して、以下のように編集します。

            #!/bin/sh

###BEGIN INIT INFO
#Provides:       zram
#Required-Start:
#Required-Stop:
#Default-Start:  2 3 4 5
#Default-Stop:   0 1 6
###END INIT INFO

case "$1" in
    start)
        modprobe zram

        echo lz4 > /sys/block/zram0/comp_algorithm
        echo 256M > /sys/block/zram0/disksize

        mkswap /dev/zram0
        swapon -p 5 /dev/zram0
        ;;
    stop)
        swapoff /dev/zram0
        sleep 1
        modprobe -r zram
        ;;
    *)
        echo "Usage $0 start | stop "
        ;;
esac

        

このスクリプトのポイントは、
CONFIG_ZRAM_LZ4_COMPRESS を有効後 lz4 アルゴリズムに変更していること(何もしなければ LZO圧縮 のまま)と、ページサイズ(=上記の場合は256MB)をお好みの指定で変えられるそうです。
今回は
2GB(2048MB) を指定してzramを利用してみます。 このスクリプトを書き換えたら、以下のように起動デーモンに登録します。

            $ chmod 755 zram.sh
$ sudo mv zram.sh /etc/init.d/
$ sudo chkconfig --add zram.sh

        

終わったら、ラズパイを再起動しましょう。


動作確認



さて、最後にzramが有効になったか確認してみます。
まずは
zramctl でzramの起動状態を確認できます。

            $ zramctl
NAME       ALGORITHM DISKSIZE  DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4             2G  100M 45.2M 49.4M       4 [SWAP]

        

ちゃんと動作しているようです。
また
swapon コマンドで、スワップ領域のマウント状況を確認します。 デフォルトで設定した2GBのスワップ領域( /var/swap )の前に、2GBのzramブロックデバイス( /dev/zram0 )がマウントされています。

            $ swapon -s
Filename                Type        Size    Used    Priority
/dev/zram0                                 partition    2097148    103168    5
/var/swap                                  file        2097148    0    -2

        

おまけで、zramがきちんとブロックデバイスとして認識されているかを
lsblk で確認してみます。

            $ lsblk -p -l
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
/dev/sda         8:0    1  7.6G  0 disk /media/pi/UDISK
/dev/sdb         8:16   1  1.7G  1 disk /media/pi/011E-AF76
/dev/mmcblk0   179:0    0 14.9G  0 disk 
/dev/mmcblk0p1 179:1    0  256M  0 part /boot
/dev/mmcblk0p2 179:2    0 14.6G  0 part /
/dev/zram0     254:0    0    2G  0 disk [SWAP]

        

これもしっかり
/dev/zram0 というブロックデバイスとして認識されているようです。


まとめ



さて、今回はラズパイへの
zram 導入手順をまとめました。
特にラズパイ4Bが発売して市場に出回っている現在においては、もうzramを使ってまでメモリを拡張するという危険を犯してまで利用する必要性は次第に薄れていくように思います。
そんな今更感の漂う
zram のお話だったですが、私事では、アメリカに居た際にラズパイ3B+が現地で35ドル程度だったのでFry'sで衝動買いしてしまい、割とまとまった数のラズパイを使わぬまま今に至ってしまいました。
…まさに、「ご利用は計画的に」を身にしみて味わってしまいました(泣)。
最近ではラズパイ4Bにzramでメモリ拡張したらさぞや快適なのでは…という個人的な興味もあってストックも数個程度欲しくはあるのですが、しばらくは3B+を消化していくしかないといった事情もあります。
しかし、半導体業界の常なのか、はたまた中の人たちの大人の事情なのか、
ラズパイ3B+発売から4B発売までの期間が1年ちょい しかなかったので、来年頃にでももうラズパイ5Bの動きがあるのかも…と思うと、4Bを大量購入するのは少し警戒感があります。
これはもう
4B は見送って、 5B が出るのを待った方が賢明なのでしょうか…悩ましいところであります。

参照

Raspberry Piでメモリを拡張したい時にZramを使うRaspberry PiでもZRAMでメモリー拡張!