photo 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/grub … GRUB_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導入やカーネルオプションの調整などをやったのは秘密です。