今回は Raspberry Pi で ZRAM 機能を有効にしようと思います。
現運用的には、メモリは全然足りています。
通常時では 100MB ほど使用しているだけです。
RAMディスク(厳密にはtmpfs)として使用している /tmp や /var/log の 64MB がフルに使用されても全然余裕です。
ただ、ガチャガチャいろいろ動かした時には 300MB くらい行くときもありました。
なので、メモリ不足回避のための保険としてSWAPを有効にしようかとも思いましたが、SWAPを有効にすると
・スワップイン、スワップアウト発生時に遅くなる
・SWAP領域(SWAPファイル)分、ディスクスペースを消費する
というデメリットがあります。
特にほぼ使われないのが分かっているのにスワップファイルにディスク容量を取られるのが勿体無いです。
(4GB microSD を使っているので、ディスク空き容量は常に意識していないと。。。)
◆ZRAM機能
Linuxにはメモリの一部を圧縮スワップ領域として使用できるZRAMという機能があります。
簡単に言うと、ディスクスペースを一切消費することなく、500MB しかないメモリを 600MB くらいとして使えるということです。
(圧縮スワップ領域が使用される場合は多少のオーバーヘッドは発生します。)
256MB~512MB 要る、というのであれば、大人しくSWAP領域を確保してください。
今回は保険のために用意しておくだけなので、1, 2割増えれば十分ですので。
◆ZRAM が使用可能かの確認
ZRAM を使用するには、ZRAM 機能が使用可能な Linux カーネルである必要があります。
以下、使用可能かの確認方法をです。(別パターンの確認方法は↓おまけ1参照)
以下のデバイスファイルがあれば ZRAM 機能が使用可能です。
あれば問題ありません。
↓を参考にカーネルコンフィグレーションを変更しカーネルをリビルドする必要があります。
◆ZRAM 機能を有効にするためのLinux カーネルコンフィグレーション
カーネルのビルド、差し替え方法はこちらをご覧ください。
[1] CONFIG_ZSMALLOC を有効化(とりあえずローダブルカーネルモジュールにしておきます)
[2] CONFIG_ZRAM を有効化(ここもとりあえずローダブルカーネルモジュールにしておきます)
(デフォルトは LZO 圧縮になります。
一般的には LZ4 圧縮の方が圧縮率は劣りますが、圧縮、展開速度が高速です。)
# 今回、ZRAM の有効化に合わせて、Linux カーネルを 4.0.4 でリビルドしました。
# 使用したカーネルコンフィグをアップしておきます。
◆initスクリプトの作成
zram.sh
CONFIG_ZRAM_LZ4_COMPRESS を有効にしているので、その後 LZ4 アルゴリズムに変更しています。
コンフィグを有効にしていても、/sys/block/zram0/comp_algorithm を変更しなければ LZO 圧縮のままとなります。("cat /sys/block/zram0/comp_algorithm" で確認できます。)
サイズはお好みで設定してください。(上記の場合は 256MBです。)
メモリサイズの半分を指定するのが一般的(?おまけ2↓参照)のようです。
◆ZRAMの有効化
再起動するか、"sudo /etc/init.d/zram.sh start" とすると、ZRAM が有効になります。
ちなみにスワップのし易さは /proc/sys/vm/swappiness に echo で値を書き込む事で設定できます。
(cat を使うと現在の設定値を取得できます。)
0から100の値を設定でき、値が大きいほうがスワップし易いです。
◆おまけ1
CONFIG_IKCONFIG_PROC が有効になっている Linux カーネルであれば下記で確認可能です。
"m" の場合はZRAMのローダブルカーネルモジュールがあるはずです。
◆おまけ2
Ubuntu 等の場合(勿論 Linux Mint も!!)は、
"sudo apt-get install zram-config" とするだけ(カーネルが対応しているのは前提ですが)で
ZRAM が使えるようになります。
その方法でインストールした場合の /etc/init/zram-config.conf を見ると、
ZRAM デバイスを CPU の数だけ作ります。
そして、一個あたりの ZRAM のサイズは全メモリサイズの半分のサイズをCPUの数で割ったサイズを指定しています。
メモリが1GBでCPUが4つの場合は、128MB(1GB / 2 / 4)の ZRAM を4つ作る(計512MB)という事です。
現運用的には、メモリは全然足りています。
通常時では 100MB ほど使用しているだけです。
RAMディスク(厳密にはtmpfs)として使用している /tmp や /var/log の 64MB がフルに使用されても全然余裕です。
$ free
total used free shared buffers cached
Mem: 480852 126700 354152 0 8548 72460
-/+ buffers/cache: 45692 435160
ただ、ガチャガチャいろいろ動かした時には 300MB くらい行くときもありました。
なので、メモリ不足回避のための保険としてSWAPを有効にしようかとも思いましたが、SWAPを有効にすると
・スワップイン、スワップアウト発生時に遅くなる
・SWAP領域(SWAPファイル)分、ディスクスペースを消費する
というデメリットがあります。
特にほぼ使われないのが分かっているのにスワップファイルにディスク容量を取られるのが勿体無いです。
(4GB microSD を使っているので、ディスク空き容量は常に意識していないと。。。)
◆ZRAM機能
Linuxにはメモリの一部を圧縮スワップ領域として使用できるZRAMという機能があります。
簡単に言うと、ディスクスペースを一切消費することなく、500MB しかないメモリを 600MB くらいとして使えるということです。
(圧縮スワップ領域が使用される場合は多少のオーバーヘッドは発生します。)
256MB~512MB 要る、というのであれば、大人しくSWAP領域を確保してください。
今回は保険のために用意しておくだけなので、1, 2割増えれば十分ですので。
◆ZRAM が使用可能かの確認
ZRAM を使用するには、ZRAM 機能が使用可能な Linux カーネルである必要があります。
以下、使用可能かの確認方法をです。(別パターンの確認方法は↓おまけ1参照)
以下のデバイスファイルがあれば ZRAM 機能が使用可能です。
$ ls /dev/zram*上記デバイスファイルがない場合は、下記ローダブルカーネルモジュールがあるか確認します。
あれば問題ありません。
$ ls /lib/modules/`uname -r`/kernel/drivers/block/zram/zram.koどちらも無い場合は、残念ながら ZRAM が使用できない Linux カーネルです。
↓を参考にカーネルコンフィグレーションを変更しカーネルをリビルドする必要があります。
◆ZRAM 機能を有効にするためのLinux カーネルコンフィグレーション
カーネルのビルド、差し替え方法はこちらをご覧ください。
[1] CONFIG_ZSMALLOC を有効化(とりあえずローダブルカーネルモジュールにしておきます)
Kernel Features --->
<M> Memory allocator for compressed pages
[2] CONFIG_ZRAM を有効化(ここもとりあえずローダブルカーネルモジュールにしておきます)
Device Drivers --->CONFIG_ZRAM_LZ4_COMPRESS も有効化しておきます。ここはお好みで。
[*] Block devices --->
<M> Compressed RAM block device support
[*] Enable LZ4 algorithm support
(デフォルトは LZO 圧縮になります。
一般的には LZ4 圧縮の方が圧縮率は劣りますが、圧縮、展開速度が高速です。)
# 今回、ZRAM の有効化に合わせて、Linux カーネルを 4.0.4 でリビルドしました。
# 使用したカーネルコンフィグをアップしておきます。
◆initスクリプトの作成
zram.sh
#!/bin/shZRAMをローダブルカーネルモジュールとしている場合は、まず modprobe コマンドでモジュールを組み込む必要があります。
### 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 アルゴリズムに変更しています。
コンフィグを有効にしていても、/sys/block/zram0/comp_algorithm を変更しなければ LZO 圧縮のままとなります。("cat /sys/block/zram0/comp_algorithm" で確認できます。)
サイズはお好みで設定してください。(上記の場合は 256MBです。)
メモリサイズの半分を指定するのが一般的(?おまけ2↓参照)のようです。
◆ZRAMの有効化
$ curl -O http://sstea.blog.jp/raspi/script/zram.shzram.sh を取得し、実行権限を付与し、init スクリプトとして登録します。
$ chmod 755 zram.sh
$ sudo mv zram.sh /etc/init.d/
$ sudo chkconfig --add zram.sh
再起動するか、"sudo /etc/init.d/zram.sh start" とすると、ZRAM が有効になります。
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/zram0 partition 131068 0 5
ちなみにスワップのし易さは /proc/sys/vm/swappiness に echo で値を書き込む事で設定できます。
(cat を使うと現在の設定値を取得できます。)
0から100の値を設定でき、値が大きいほうがスワップし易いです。
◆おまけ1
CONFIG_IKCONFIG_PROC が有効になっている Linux カーネルであれば下記で確認可能です。
$ zcat /proc/config.gz | grep CONFIG_ZRAMで、"CONFIG_ZRAM=y" または "CONFIG_ZRAM=m" と表示されれば、問題ありません。
"m" の場合はZRAMのローダブルカーネルモジュールがあるはずです。
◆おまけ2
Ubuntu 等の場合(勿論 Linux Mint も!!)は、
"sudo apt-get install zram-config" とするだけ(カーネルが対応しているのは前提ですが)で
ZRAM が使えるようになります。
その方法でインストールした場合の /etc/init/zram-config.conf を見ると、
ZRAM デバイスを CPU の数だけ作ります。
そして、一個あたりの ZRAM のサイズは全メモリサイズの半分のサイズをCPUの数で割ったサイズを指定しています。
メモリが1GBでCPUが4つの場合は、128MB(1GB / 2 / 4)の ZRAM を4つ作る(計512MB)という事です。