スワップによる仮想記憶をより効率的に使うための手法に、zramswapとzswapがあります。両者の違いを見ていきましょう。
手法 | zramswap | zswap |
---|---|---|
手段 | 圧縮機能付きRAMディスクをスワップ領域に割り当てる | スワップアウトしたページを圧縮しつつメモリ内にキャッシュする |
スワップ領域 | なくても構わない | 必須 |
使用方法 | zram-toolsパッケージをインストール | sysfsに書き込み、またはカーネルパラメータで設定 |
圧縮アルゴリズム | lzo|lz4|lz4hc|deflate|842 | lz4|deflate|lz4hc|lzo|lzo-rle|842|zstd |
zramswap
zramswapを使うには、zram-toolsをインストールします。
swap以外にもzramの使用設定ができるsystemd-zram-generatorというのもあります。
$ sudo apt install zram-tools
zramの状況表示にはzramctlコマンドを使います。
圧縮アルゴリズム、ディスクサイズ、実データサイズ、圧縮済みデータサイズ、マウント先などが表示されます。
$ zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4 3.9G 4K 64B 4K 4 [SWAP]
新しくzramデバイスを作るにはzramctl -fを使います。
スワップに限定されないRAMディスクなので、フォーマットして/tmpあたりにマウントすることができます。
$ sudo zramctl -f -s 1G -a lz4
/dev/zram1
$ zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram1 lz4 1G 0B 0B 0B 4
/dev/zram0 lz4 3.9G 4K 64B 4K 4 [SWAP]
zramデバイスの消去にはzramctl -rコマンドを使います。
$ sudo zramctl -r /dev/zram1
$ zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4 3.9G 4K 64B 4K 4 [SWAP]
$ swapon
NAME TYPE SIZE USED PRIO
/swapfile file 8G 0B -2
/dev/zram0 partition 3.9G 0B 100
/etc/default/zramswapで圧縮アルゴリズムやディスク容量の設定ができます。
# Compression algorithm selection
# speed: lz4 > zstd > lzo
# compression: zstd > lzo > lz4
# This is not inclusive of all that is available in latest kernels
# See /sys/block/zram0/comp_algorithm (when zram module is loaded) to see
# what is currently set and available for your kernel[1]
# [1] https://github.com/torvalds/linux/blob/master/Documentation/blockdev/zram.txt#L86
ALGO=lz4
# Specifies the amount of RAM that should be used for zram
# based on a percentage the total amount of available memory
# This takes precedence and overrides SIZE below
PERCENT=50
# Specifies a static amount of RAM that should be used for
# the ZRAM devices, this is in MiB
#SIZE=1024
# Specifies the priority for the swap devices, see swapon(2)
# for more details. Higher number = higher priority
# This should probably be higher than hdd/ssd swaps.
#PRIORITY=100
zswap
zswapをとりあえず使うには、sysfsによる操作が簡単です。
grepを使い、/sys/module/zswap/parameters/ディレクトリ内のファイル内を走査し、正規表現/./にマッチする内容のファイルと内容を出力します。
$ grep -r . /sys/module/zswap/parameters/
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:N
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/compressor:lzo
/sys/module/zswap/parameters/zpool:zbud
/sys/module/zswap/parameters/accept_threshold_percent:90
圧縮アルゴリズムに高圧縮率のlz4、アロケーターに1つのページファイルに圧縮済みデータを3個詰め込めるz3foldを指定し、zswapを有効化します。
$ echo lz4 |sudo tee /sys/module/zswap/parameters/compressor
lz4
$ echo z3fold |sudo tee /sys/module/zswap/parameters/zpool
z3fold
$ echo 1 |sudo tee /sys/module/zswap/parameters/enabled
1
再度grepで、zswapの内容を見てみます。
$ grep -r . /sys/module/zswap/parameters/
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/compressor:lz4
/sys/module/zswap/parameters/zpool:z3fold
/sys/module/zswap/parameters/accept_threshold_percent:90
カーネル起動時からzswapを使うときは/etc/default/grubを書き換えます。
- GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
+ GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.compressor=lz4 zswap.zpool=z3fold"
grubメニューを書き換えます。
$ sudo update-grub
起動時にz3foldモジュールが自動で読み込まれないので、明示的に読み込むようにします。
+ z3fold
+ lz4
+ lz4_compress
そしてupdate-initramfsでinitramfsを書き換えます。
$ sudo update-initramfs -k all -u