1.Linux 虚拟内存管理中 Swap 和 Zram

Swap 将硬盘空间模拟成一部分额外的内存来使用, 是最传统的 Linux 虚拟内存实现方式。
当系统的物理内存 (RAM) 快要耗尽时,操作系统会将一部分当前不活跃的内存页面 (pages) 移动 (或称“交换”) 到硬盘上的特定区域(可以是独立的交换分区或交换文件)。当这些被交换出去的数据再次需要被访问时,系统会再将它们从硬盘读回物理内存,同时可能将另一部分不活跃的数据再次交换出去。

Zram 在内存 (RAM) 中创建一个经过压缩的块设备,并将其用作交换空间, 是一个相对较新的 Linux 内核模块。 与 Swap 不同,Zram 不使用硬盘。它将需要交换出去的内存页面先进行压缩,然后存储在 RAM 的另一个区域。当需要访问这些数据时,再将其解压缩并读回。因为整个过程都在内存中进行,所以比硬盘交换快得多。

特性Swap (传统)ZRAM
存储介质硬盘/SSD (分区或文件)物理内存 (RAM)
工作原理将内存页移至磁盘将内存页压缩后存储在 RAM 中
性能/速度慢 (受磁盘 I/O 限制)快 (受内存速度和 CPU 压缩性能限制)
CPU 消耗中等 (压缩/解压需要计算)
存储设备磨损会磨损 (尤其 SSD)不磨损
休眠支持支持不支持
主要目的大幅扩展可用内存总量 (牺牲速度)提升内存利用率和响应速度
适用场景内存严重不足、需要休眠功能内存中等、追求响应速度、保护 SSD

1. 确认内核是否支持&有无启用 ZRAM

ZRAM 是内核模块,就需要先检查当前 Linux 机器的内核是否存在这一模块。
在配置之前,需要读者先确认一下自己的内核版本是否在 3.14 以上,部分 VPS 由于依旧使用 Xen、OpenVZ 等虚拟/容器化技术,内核版本往往卡在 2.6,那么这样的机器是无法开启 ZRAM 的。

uname -r

但根据内核版本判断毕竟不可靠,如 CentOS 7,虽然内核版本是 3.10,却支持 ZRAM,也有极少数发行版或嵌入式 Linux 为了降低资源占用,选择不编译 ZRAM,因此我们最好使用 modinfo 命令来检查一下有无 ZRAM 支持:
因此使用 modinfo 命令是比较有效的。

modinfo zram

部分发行版会默认启用但不配置 ZRAM,我们可以使用lsmod检查 ZRAM 是否启用:

lsmod | grep zram

2. 启用 ZRAM 内核模块

ZRAM 是 Linux 内核的模块,要启用 ZRAM 请使用 modprobe 命令加载 ZRAM 模块。运行命令 sudo modprobe zram num_devices=1
num_devices 是 ZRAM 模块的参数,zram num_devices=1 表示仅创建一个设备文件,该文件将会保存在设备目录,文件名称是 /dev/zram0。
如果 num_devices 的数值不等于 1,内核将会创建多个 zram 文件 /dev/zram{0,1,2,3...}。

然后运行 lsmod 命令 lsmod | grep zram 确认是否成功加载。命令将会打印消息 zram 32768 0 。

sudo modprobe zram num_devices=1
lsmod  | grep zram

3. 配置 zram0 设备

启用 ZRAM 内核模块就可以配置ZRAM,通常 ZRAM 最常用的设置选项是 ZRAM 的大小 disksize 和 ZRAM 的压缩算法 comp_algorithm。
控制 ZRAM 的大小的文件是 /sys/block/zram0/disksize ,压缩算法文件是 /sys/block/zram0/comp_algorithm 。
可以运行 cat 命令查看两个文件来确定 ZRAM 文件的大小和压缩算法,例如命令cat /sys/block/zram0/disksize 查看 ZRAM 大小。
2024-12-17T07:49:43.png
同样也可以通过两个文件设置 ZRAM 文件的大小和压缩算法,例如命令 echo "2048M" | sudo tee /sys/block/zram0/disksize 修改 zRAM 的大小。
ZRAM 目前的默认压缩算法一般是lzo-rle,但其实 ZRAM 支持的压缩算法有很多,我们可以通过 cat /sys/block/zram0/comp_algorithm 获取支持的算法,当前启用的算法被[]括起来
2024-12-17T08:02:33.png
要更改 zRAM 的压缩算法,可以使用下面命令: echo "lzo" | sudo tee /sys/block/zram0/comp_algorithm

4. 激活 ZRAM

创建swap分区

sudo mkswap /dev/zram0

挂载swap分区swapon(-p指优先级,数值约大优先级越高。)

sudo swapon -p 1 /dev/zram0

验证 ZRAM 是否成功启用

swapon --show

5. 关闭 ZRAM

sudo swapoff /dev/zram0
sudo modprobe -r zram

95~我想带你去海边