今回は Raspberry Pi で ZRAM 機能を有効にしようと思います。

現運用的には、メモリは全然足りています。
通常時では 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  --->
[*] Block devices  --->
<M>   Compressed RAM block device support
[*]     Enable LZ4 algorithm support
     CONFIG_ZRAM_LZ4_COMPRESS も有効化しておきます。ここはお好みで。
     (デフォルトは LZO 圧縮になります。
       一般的には LZ4 圧縮の方が圧縮率は劣りますが、圧縮、展開速度が高速です。)

# 今回、ZRAM の有効化に合わせて、Linux カーネルを 4.0.4 でリビルドしました。
# 使用したカーネルコンフィグをアップしておきます。

◆initスクリプトの作成

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
ZRAMをローダブルカーネルモジュールとしている場合は、まず modprobe コマンドでモジュールを組み込む必要があります。

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.sh
$ chmod 755 zram.sh
$ sudo mv zram.sh /etc/init.d/
$ sudo chkconfig --add zram.sh
zram.sh を取得し、実行権限を付与し、init スクリプトとして登録します。

再起動するか、"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)という事です。