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
オプションでカラム名を引っ張ってきただけですが、各カラムは以下のようです。
カラム名 | 意味 |
---|---|
NAME | zram device name |
DISKSIZE | limit on the uncompressed amount of data |
DATA | uncompressed size of stored data |
COMPR | compressed size of stored data |
ALGORITHM | the selected compression algorithm |
STREAMS | number of concurrent compress operations |
ZERO-PAGES | empty pages with no allocated memory |
TOTAL | all memory including allocator fragmentation and metadata overhead |
MEM-LIMIT | memory limit used to store compressed data |
MEM-USED | memory zram have been consumed to store compressed data |
MIGRATED | number of objects migrated by compaction |
MOUNTPOINT | where the device is mounted |