来自 Arch Linux 中文维基

zswap 是一个内核功能,它为交换页提供了一个压缩的内存缓存。原本会交换到磁盘的页被压缩并存储到内存中的存储池中。一旦池已满或内存耗尽,最近最少使用的(LRU)页就会被解压缩并写入磁盘,就好像它没有被拦截一样。将页解压缩到交换缓存后,可以释放池中的压缩版本。

zram 相比的区别在于,zswap 与 swap 设备协同工作,而 zram 是内存中的交换设备,不需要后备交换设备。

开关 zswap

在稳定版(stable)的 linux 官方内核中,zswap 会被默认启用。这可以通过稳定版内核配置中的 CONFIG_ZSWAP_DEFAULT_ON 标志进行验证。

要在运行时禁用 zswap,请执行下面的命令:

# echo 0 > /sys/module/zswap/parameters/enabled

要永久禁用 zswap,添加 zswap.enabled=0 到你的内核参数

定制 zswap

当前参数

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 文档获取不同参数的描述。

显示初始配置的引导时加载消息可以通过以下方式检索:

# dmesg | grep zswap:
[    0.317569] zswap: loaded using pool lz4/z3fold

设定参数

使用 sysfs

每个设置都可以在运行时通过 sysfs 接口进行更改。作为示例,要更改 compressor 参数:

# echo lz4 > /sys/module/zswap/parameters/compressor

使用内核引导参数

要持久化参数更改,必须在内核引导参数中添加相应的选项,例如 zswap.compressor=lz4。因此,要永久设定上述所有设置,必须添加以下内核参数

zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold

当通过引导参数更改压缩算法时,需要确保在引导期间尽早加载相应的压缩模块(参考 #压缩算法)。

最大池大小

存储池不是预先分配的,它可以增长到可用内存总量的一定百分比,默认情况下最多占内存总量的20%。一旦达到此阈值,就会将页从池中逐出到交换设备中。压缩池的最大大小由参数 max_pool_percent 控制。

压缩存储池分配器

zpool 参数控制压缩存储池的管理。

使用 zbud 数据分配器,2个压缩对象被存储到1个页中,这将压缩比限制为2或更小。

更好的 z3fold 分配器允许每页最多3个压缩对象。z3fold 的压缩比通常为2.7,而 zbud 的压缩比通常为1.7。

默认情况下,会创建 z3fold 类型的 zpool。使用内核参数 zswap.zpool 在启动时选择另一种方法。数据分配器也可以在稍后阶段通过 sysfs 接口进行更改。

压缩算法

对于页的压缩,zswap 使用内核加密 API 提供的压缩器模块。默认情况下会使用 lz4 压缩算法,但也可以在启动时使用 zswap.compressor 更改压缩算法。其他选项包括 deflate, lz4hc, lzo, lzo-rle, 842zstd

使用 sysfs 在运行时更改压缩不会有问题,但在本例中,zswap 从 lz4 开始,并在稍后阶段切换到定义的算法。要立即使用另一种算法启动 zswap,必须通过内核引导参数进行设定,并且内核必须尽早加载相应的模块。这可以通过以下步骤来实现:

  1. 将与所选压缩器相关的模块添加到 mkinitcpio#模块(MODULES)数组中。
  2. 修改 mkinitcpio 配置后重新生成 ramdisk 环境:见 mkinitcpio#创建和启用镜像
  3. 内核参数中将 zswap.compressor 设定为你选择的算法。

在下次启动时,见 #当前参数来检查 zswap 现在是否使用了请求的压缩器。

另见