以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

zramやzswapを試してみたの巻。

http://www.flickr.com/photos/74845463@N00/401702766photo by brutalSoCal Ubuntu機の搭載メモリが1GBと少なくいろいろつらいので、メモリ圧縮機能のzramやzswapを試してみたという話。ちょっと長いので続きを読むから。

まずzramを試してみた

Ubuntu 14.04.2 LTSではzram-configというパッケージを導入するだけで有効になる。

$ sudo aptitude install zram-config

筆者環境では約200Mある/dev/zram0,/dev/zram1が作成され、優先度5でスワップが有効になった。

zramをpurgeしてzswapをオンにしてみたが…

いろいろ調べてみてzswapの方がいいのではと思い、zram-configを削除し、カーネルブートオプションでzswapを有効化して再起動してみた。

$ sudo aptitude purge zram-config
$ sudo vi /etc/default/grub
(GRUB_CMDLINE_LINUX_DEFAULTにzswap.enabled=1を追記)
$ cat /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash zswap.enabled=1"
…
$ sudo update-grub2
$ sudo reboot

だがLinuxの起動速度が遅くなるなどパフォーマンスに影響したので無効化してzram-configを入れなおした。

Chromeが重い

しばらく使っていると、zram使用時のChromeの動作が非常に重たい。圧縮方式の関係か?と思い圧縮方式をlzoから負荷が軽いlz4にしようと思った。が、Ubuntu 14.04.2 LTSのデフォルトカーネル(3.13系)では/sys/block/zram*/comp_algorithmがなく、zramの圧縮方式の変更ができない罠があった。というわけで思い切ってUbuntu 15.04(vivid)で使われているカーネル(3.19系)を入れることにした。メタパッケージのlinux-image-generic-lts-vividを導入すればOK(ヘッダーも導入しておくとよろし)。

$ sudo aptitude install linux-image-generic-lts-vivid
$ sudo aptitude install linux-headers-generic-lts-vivid
$ sudo reboot

VirtualBoxを入れている場合、DKMS(カーネルモジュールのビルド)がエラーになる。一応なんとかする方法があったりするが、VirtualBoxのソース取ってきてパッチ当ててビルドして…というのは非常に面倒くさいし時間がかかるのでアップデートされるまでVirtualBoxは諦めることにする。
再起動後、zramの圧縮方式にlz4が使えるかどうか確認。

$ cat /sys/block/zram0/comp_algorithm
[lzo] lz4

使えるようになったので、/etc/init/zram-config.confをいじってlz4で圧縮するように設定する。

$ sudo vi /etc/init/zram-config.conf
$ cat /etc/init/zram-config.conf
…
  # initialize the devices
  for i in $(seq ${NRDEVICES}); do
    DEVNUMBER=$((i - 1))
    echo 'lz4' > /sys/block/zram${DEVNUMBER}/comp_algorithm #←これを追加
    echo $mem > /sys/block/zram${DEVNUMBER}/disksize
    mkswap /dev/zram${DEVNUMBER}
    swapon -p 5 /dev/zram${DEVNUMBER}
  done
…
$ sudo reboot

再起動後再確認。

$ cat /sys/block/zram0/comp_algorithm
lzo [lz4]

これでChromeの重さもほぼ lzoに比べてマシになったとさ。めでたしめでたし。

※2015/06/10 16:18 表現一部修正

番外編 - VPSにも導入

CentOS 6.6でカーネルバージョン 2.6.32-504.16.2.el6.x86_64だが、zramは使える模様(lz4圧縮は使えない)。

$ grep CONFIG_ZRAM /boot/config-2.6.32-504.16.2.el6.x86_64
CONFIG_ZRAM=m
CONFIG_ZRAM_DEBUG=y

こちらのページを参考に、/etc/init.d内にzramを有効化するスクリプトを作成する(内容はここでは省略)。そして有効化。

$ sudo vi /etc/init.d/zram
$ sudo chkconfig --add zram
$ sudo chkconfig zram on
$ sudo /etc/init.d/zram start

ディスクスワップをメモリ(zram)上に移動させるため無効化→有効化する(/var/swap0(スワップファイル)を2回swapoffしているのはpriority修正のため(swaponで-pオプション使えばいいのに…))。

$ sudo swapoff /var/swap0
$ sudo swapon -a
$ sudo swapoff /dev/vda2
$ sudo swapon -a
$ sudo swapoff /var/swap0
$ sudo swapon -a

完了(※以下のswaponの表示は有効化後しばらく使ったあとの表示)。

$ swapon -s
Filename				Type		Size	Used	Priority
/dev/vda2                               partition	2096476	56604	-1
/var/swap0                              file		4194300	56280	-2
/dev/zram0                              partition	320364	300744	100
/dev/zram1                              partition	320364	300704	100
/dev/zram2                              partition	320364	300816	100

蛇足

zram導入する前にpreload導入やカーネルオプションの調整などをやったのは秘密です。