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


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でメモリー拡張!

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。