[other] 使用zSwap(内存压缩)技术提高系统性能
Tofloor
poster avatar
流浪的加菲
deepin
2024-03-14 10:47
Author

概述

zSwap(内存压缩)是linux内核的一项功能,顾名思义,内存压缩就是压缩内存,节省内存空间。

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

内存管理框架(内存压缩技术处于内存回收memory reclaim部分中):

image.png

zSwap简介

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

zSwap并不虚拟一个块设备,而是hook到普通的swap代码里,在实际发生写入到磁盘/从磁盘读取的操作前,先利用自己管理的内存进行数据的换出/换入,内存不够用以后再使用传统的swap分区,所以zSWAP适用于本身已经有交换分区的系统(zRam更适合Android这样本身不配置交换分区的嵌入式系统)。

zSwap发展背景

在3.11版本Linux内核实现了以下新功能:

  • 加入了用于创建安全临时文件的标识位OTMPFILE;
  • 实验性的Radeon显卞动态电源管理支持,需要传递radeon.dpm=1参数启用;
  • 针对并行分布式文件系统Lustre的客户端支持;
  • 初步支持NFS42和具备SELinmx标签的NFS分区;
  • 改善了SYSVIPc消息队列扩展性;
  • 允许应用程序请求低延迟网络Polling;
  • 详细的页面写入历史追踪;
  • 加可压缩交换分区缓存zSwap等;

开启 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

zRAM原理解析

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

zRAM的实现是把自己虚拟成一个swap分区,本身存在一些缺陷或问题:

  • 使用zRAM可能会在低内存场景由于频繁的内存压缩导致kswapd进程占CPU高;
  • 当内存快填满的时候,zRAM本身会试图向内存返回数据,而系统会试图向zRAM中填充数据;
  • 另外,增大了zRAM配置,对系统内存碎片是否有影响;

zSwap原理解析

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

与zRAM相比,zSwap则是介入了内核的swap过程,将所有被系统swap出来的数据全部截留,存入自己的存储器中。这种实现方式有个好处,就是能和真正存在于硬盘上的swap分区联合使用,可以避免zRam的问题。

一方面,zSwap在面临内存不足时可以向swap分区写入数据,而不会试图向内存中返回数据。另一方面,如果有大段内存被空闲程序占据,zSwap可以把这些数据填入硬盘中,由于这些内存极少被使用,所以存入较慢的硬盘也不会影响运行速度。

image.png

zSwap本身存在一些缺陷或问题:

如果开启“当zSwap满交换出backing store”的功能, 由于需要将zSwap里的内存按LRU顺序解压再swap out,这就要求内存分配器支持LRU功能;

如果不开启“当zSwap满交换出backing store”的功能, 那么和zRam有一样的缺陷问题;


主流内存压缩技术:zSwap、zRAM、zCache

deepin wiki 内有整理有更详细的资料(zRAM):Linux内存压缩技术

相关文献地址:

Linux内存压缩浅析之原理

zRAM内存压缩技术原理与应用

Reply Favorite View the author
All Replies
流浪的加菲
deepin
2024-03-14 10:48
#1

applaud搬砖到 deepin wiki 了,更详细、更系统(zRAM):Linux内存压缩技术

Reply View the author
jjcui8595
deepin
2024-03-14 11:37
#2

感谢分享,怎样开启?

Reply View the author
Tonny
deepin
2024-03-14 12:30
#3
It has been deleted!
神末shenmo
deepin
Spark-App
2024-03-14 12:30
#4

实验性的Radeon显卞动态电源管理支持,需要传递radeon.dpm=1参数启用;

用OCR拿的文章?joy

Reply View the author
流浪的加菲
deepin
2024-03-14 13:37
#5
神末shenmo

实验性的Radeon显卞动态电源管理支持,需要传递radeon.dpm=1参数启用;

用OCR拿的文章?joy

外面看到了扒过来分享下:http://www.wowotech.net/memory_management/zram.html

Reply View the author
流浪的加菲
deepin
2024-03-14 16:27
#6
jjcui8595

感谢分享,怎样开启?

帖子内有教程,不过还是不建议折腾了,怕你们翻车了,哈哈😂

Reply View the author
jjcui8595
deepin
2024-03-14 18:19
#7
流浪的加菲

帖子内有教程,不过还是不建议折腾了,怕你们翻车了,哈哈😂

joy

Reply View the author