スワップの圧縮手法：zramswapとzswap

スワップによる仮想記憶をより効率的に使うための手法に、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というのもあります。

```shell-session
$ sudo apt install zram-tools 
```
zramの状況表示にはzramctlコマンドを使います。
圧縮アルゴリズム、ディスクサイズ、実データサイズ、圧縮済みデータサイズ、マウント先などが表示されます。

```shell-session
$ zramctl 
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4           3.9G   4K   64B    4K       4 [SWAP]
```
新しくzramデバイスを作るにはzramctl -fを使います。
スワップに限定されないRAMディスクなので、フォーマットして/tmpあたりにマウントすることができます。
```shell-session
$ 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コマンドを使います。

```shell-session
$ 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で圧縮アルゴリズムやディスク容量の設定ができます。

```conf:/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/ディレクトリ内のファイル内を走査し、正規表現/./にマッチする内容のファイルと内容を出力します。
```shell-session
$ 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を有効化します。
```shell-session
$ 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の内容を見てみます。

```shell-session
$ 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を書き換えます。

```diff_conf:/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メニューを書き換えます。


```shell-session
$ sudo update-grub
```

起動時にz3foldモジュールが自動で読み込まれないので、明示的に読み込むようにします。

```diff_conf:/etc/initramfs-tools/modules 
+ z3fold
+ lz4
+ lz4_compress
```

そしてupdate-initramfsでinitramfsを書き換えます。

```shell-session
$ sudo update-initramfs -k all -u
```