zswap

来自 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 现在是否使用了请求的压缩器。

另见[编辑 | 编辑源代码]