如何使用 zSwap 提高系统性能

Posted by Mike on 2023-02-23

使用 zSWAP、zstd 和 z3fold 来提高操作系统的性能

压缩可以降低占用空间,顾名思义,内存压缩就是压缩内存,节省内存空间。就目前的技术而言, I/O 的速度远远慢于这 RAM 操作速度。因此,如果频繁地做 I/O 操作,不仅影响 flash 使用寿命,还严重影响系统性能。内存压缩是一种让 I/O 过程平滑过渡的做法, 即尽量减少由于内存紧张导致的 I/O,提升性能。

介绍 zSwap 技术

zSwapLinux 内核的一个功能,它为交换页提供了一个压缩的回写缓存,作为一种虚拟内存压缩形式。当内存页要被换出时,zSwap 不会把它们移到交换设备上,而是对它们进行压缩,然后把它们存储到系统 RAM 中动态分配的内存池中。后来,向实际的交换设备的回写被推迟了,甚至完全避免了,从而大大减少了需要交换的 Linux 系统的 I/O,其代价是需要额外的 CPU 周期来执行压缩。

zSwap 允许 Linux 更有效地利用 RAM,因为它实际上增加了内存容量,而不是在压缩/解压缩交换页时稍微增加 CPU 的使用。zSwap 存在于内核中,但默认并没有开启,要使用它必须通过修改配置文件开启。

主流内存压缩技术

  • zSwap

zSwap 是在 memoryflash 之间的一层缓存,当内存需要 swap 出去磁盘的时候,先通过压缩放到 zSwap 中去,zSwap 空间按需增长。达到一定程度后则会按照 LRU 的顺序(前提是使用的内存分配方法需要支持 LRU)将就最旧的 page 解压写入磁盘 swap device,之后将当前的 page 压缩写入 zSwap

zSwap 本身存在一些缺陷或问题:如果开启当 zSwap 满交换出 backing store 的功能, 由于需要将 zSwap 里的内存按 LRU 顺序解压再 swap out,这就要求内存分配器支持 LRU 功能;如果不开启当 zSwap 满交换出 backing store 的功能, 和 zRam 是类似的。

  • zRAM

zRram 即压缩的内存,使用内存模拟 block device 的做法。实际不会写到块设备中去,只会压缩后写到模拟的块设备中,其实也就是还是在 RAM 中,只是通过压缩了。由于压缩和解压缩的速度远比读写 I/O 好,因此在移动终端设备广泛被应用。

zRram 本身存在一些缺陷或问题:zRam 大小是可灵活配置的,配置多少成为了一个问题;使用 zRam 可能会在低内存场景由于频繁的内存压缩导致 kswapd 进程占 CPU 高;增大了 zRam 配置,对系统内存碎片是否有影响

  • zCache

zCacheoracle 提出的一种实现文件页压缩技术,也是 memoryblock dev 之间的一层存储,与 zSwap 比较接近,但 zCache 目前压缩的是文件页,而 zSwapzRAM 压缩是匿名页。

介绍 zstd 压缩算法

Zstandard 是一种实时压缩算法,提供高压缩率。它提供了非常广泛的压缩/速度权衡,同时有一个非常快的解码器支持。它还为小数据提供了一种特殊的模式,称为字典压缩,并可以从任何样本集中创建字典。Zstandard 库是作为使用 BSD 许可证的开源软件提供的。

开启 zSwap 的方法

1
2
3
4
5
6
# edit grub as root
$ sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.compressor=zstd zswap.zpool=z3fold"

# update grub
$ sudo update-grub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# install zstd and Z3fold
$ sudo apt install checkinstall build-essential
$ sudo apt install zstd # not the latest version

# edit the modules file
$ sudo vim /etc/initramfs-tools/modules
...
zstd
zstd_compress
z3fold

# update initramfs
$ sudo update-initramfs -u -k all

# restart PC and verify ZSWAP if enabled
$ cat /sys/module/zswap/parameters/enabled
Y

# verify ZSWAP if its using zstd and z3fold
$ sudo dmesg | grep -i zswap:
[ 1.059997] zswap: loaded using pool zstd/z3fold

参考链接地址

本文转载自:「 Escape 的博客 」,原文:https://url.hi-linux.com/oIcpv ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com