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

Raspberry Piでメモリを拡張したい時にZramを使う
目次

Raspberry Pi で電子工作をしている時にメモリ不足に陥りました。 これに対処すべく調査していった結果、Zram という機構が使えそうだったので試してみました。

Zramとは

Zram はRAM上に圧縮されたブロックデバイスを構築できます。 作成されたブロックデバイスはスワップとして使われたり、一般のRAMのように使われます。

手持ちの Raspberry Pi はメモリが1Gしかないので、メモリを消費するプログラムを動かすとすぐに溢れてしまいます。 Zram を作成して、メモリにもう少し持ちこたえてもらいましょう。

Zramのセットアップ

ここから Zram のセットアップを始めましょう。

Zramが利用可能かを確認する

まずは動作しているLinuxカーネルが Zram に対応しているか調べる必要があります。 zram.ko ファイルが存在すれば Zram を使うことができます。

1ls /lib/modules/4.19.42-v7+(カーネルのバージョン)/kernel/drivers/block/zram/zram.ko

Zramをデーモン登録する

Zram領域を確保するためのデーモンスクリプトを取得します。 幸いなことに公開してくださっている方がいるので、こちらを参考にします。

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

中身はシンプルですが、ポイントは /sys/block/zram0/comp_algorithm に指定する圧縮アルゴリズムと、 /sys/block/zram0/disksize に指定する確保する領域です。

ここは必要に応じて書き換えてください。

 1#!/bin/sh
 2### BEGIN INIT INFO
 3# Provides:       zram
 4# Required-Start:
 5# Required-Stop:
 6# Default-Start:  2 3 4 5
 7# Default-Stop:   0 1 6
 8### END INIT INFO
 9
10case "$1" in
11	start)
12		modprobe zram
13
14		echo lz4 > /sys/block/zram0/comp_algorithm
15		echo 2048M > /sys/block/zram0/disksize
16
17		mkswap /dev/zram0
18		swapon -p 5 /dev/zram0
19		;;
20	stop)
21		swapoff /dev/zram0
22		sleep 1
23		modprobe -r zram
24		;;
25	*)
26		echo "Usage $0 start | stop "
27		;;
28esac

編集が終了した後 zram.sh をデーモン登録します。

1sudo mv zram.sh /etc/init.d/

最後に Raspberry Pi を再起動すれば使えるようになります。

zramctlコマンドでzramを確認する

zramctl コマンドでzramの状態を確認できます。DISKSIZEが 2G 取られていることが確認できます。

1zramctl
2
3> NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
4> /dev/zram0 lz4             2G   4K   64B    4K       4 [SWAP]

--help オプションでカラム名を引っ張ってきただけですが、各カラムは以下のようです。

カラム名意味
NAMEzram device name
DISKSIZElimit on the uncompressed amount of data
DATAuncompressed size of stored data
COMPRcompressed size of stored data
ALGORITHMthe selected compression algorithm
STREAMSnumber of concurrent compress operations
ZERO-PAGESempty pages with no allocated memory
TOTALall memory including allocator fragmentation and metadata overhead
MEM-LIMITmemory limit used to store compressed data
MEM-USEDmemory zram have been consumed to store compressed data
MIGRATEDnumber of objects migrated by compaction
MOUNTPOINTwhere the device is mounted

参考にさせていただいたサイト