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 大小。
同样也可以通过两个文件设置 ZRAM 文件的大小和压缩算法,例如命令 echo "2048M" | sudo tee /sys/block/zram0/disksize
修改 zRAM 的大小。
ZRAM 目前的默认压缩算法一般是lzo-rle,但其实 ZRAM 支持的压缩算法有很多,我们可以通过 cat /sys/block/zram0/comp_algorithm 获取支持的算法,当前启用的算法被[]括起来
要更改 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