使用 zSWAP、zstd 和 z3fold 来提高操作系统的性能!
压缩可以降低占用空间,顾名思义,内存压缩就是压缩内存,节省内存空间。就目前的技术而言, I/O
的速度远远慢于这 RAM
操作速度。因此,如果频繁地做 I/O
操作,不仅影响 flash
使用寿命,还严重影响系统性能。内存压缩是一种让 I/O
过程平滑过渡的做法, 即尽量减少由于内存紧张导致的 I/O
,提升性能。
使用zSwap提高系统性能
介绍 zSwap 技术
zSwap
是 Linux
内核的一个功能,它为交换页提供了一个压缩的回写缓存,作为一种虚拟内存压缩形式。当内存页要被换出时,zSwap
不会把它们移到交换设备上,而是对它们进行压缩,然后把它们存储到系统 RAM
中动态分配的内存池中。后来,向实际的交换设备的回写被推迟了,甚至完全避免了,从而大大减少了需要交换的 Linux
系统的 I/O
,其代价是需要额外的 CPU
周期来执行压缩。
zSwap
允许 Linux
更有效地利用 RAM
,因为它实际上增加了内存容量,而不是在压缩/解压缩交换页时稍微增加 CPU
的使用。zSwap
存在于内核中,但默认并没有开启,要使用它必须通过修改配置文件开启。
主流内存压缩技术
- zSwap
zSwap
是在 memory
与 flash
之间的一层缓存,当内存需要 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
zCache
是 oracle
提出的一种实现文件页压缩技术,也是 memory
与 block dev
之间的一层存储,与 zSwap
比较接近,但 zCache
目前压缩的是文件页,而 zSwap
和 zRAM
压缩是匿名页。
介绍 zstd 压缩算法
Zstandard
是一种实时压缩算法,提供高压缩率。它提供了非常广泛的压缩/速度权衡,同时有一个非常快的解码器支持。它还为小数据提供了一种特殊的模式,称为字典压缩,并可以从任何样本集中创建字典。Zstandard
库是作为使用 BSD
许可证的开源软件提供的。
开启 zSwap 的方法
# 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
# 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