zram 技术详解与实战指南
目录
1. 技术原理
什么是 zram
zram(最初称为 compcache)是 Linux 内核中的一个模块,它在 RAM 中创建一个压缩的块设备。当数据写入该设备时,数据会被实时压缩并存储在内存中;当读取数据时,数据会被解压缩。
zram 最常见的用途是作为Swap(交换分区)。通过将内存中的冷数据压缩后存回内存,而不是写入缓慢的磁盘,zram 可以显著提高系统的响应速度,尤其是在内存受限的设备(如嵌入式系统、旧电脑、入门级云主机)上。
工作原理
zram 的核心流程如下:
- 写操作 :文件系统或 Swap 子系统向 zram 设备发送写请求(Page)。zram 驱动接收请求,使用选定的压缩算法(如 LZO, LZ4, ZSTD)压缩数据,然后通过
zsmalloc分配器将压缩后的数据存储在物理内存中。 - 读操作:系统请求读取数据。zram 驱动找到对应的内存块,解压缩数据,并将其返回给请求者。

zram vs 传统 Swap
| 特性 | zram (压缩内存 Swap) | 传统磁盘 Swap (HDD/SSD) |
|---|---|---|
| 存储介质 | 物理 RAM | 硬盘 / SSD |
| I/O 延迟 | 极低 (微秒级, CPU 密集型) | 高 (毫秒级, IO 密集型) |
| 吞吐量 | 极高 (GB/s 级别) | 受限于磁盘接口 (MB/s) |
| CPU 消耗 | 较高 (用于压缩/解压) | 极低 (DMA 传输) |
| 内存占用 | 占用物理内存 (压缩后) | 不占用物理内存 |
| 磁盘磨损 | 无 | 有 (尤其是 SSD) |
| 适用场景 | 内存紧张、嵌入式、无 Swap 分区 | 内存充足、休眠 (Hibernation) |
性能对比示意图:

注:zram 的读写延迟远低于传统 HDD Swap,略高于纯内存操作,但提供了更大的有效内存容量。
内核实现架构
zram 位于 Linux 内核的块设备层(Block Device Layer)。它不直接操作底层物理磁盘,而是通过 zsmalloc 内存分配器管理内存池。

- VFS / Block Layer: 处理上层的文件系统请求。
- zram Driver: 核心驱动,负责压缩/解压调度。
- Compressor: 压缩算法后端(LZO, LZ4, ZSTD 等)。
- zsmalloc: 专门为存储压缩页面设计的内存分配器,解决内存碎片问题。
2. 配置部署指南
安装与检查
zram 自 Linux 3.14 起已合并入主线内核,大多数现代发行版默认已编译该模块。
检查内核模块:
bash
modinfo zram
加载模块:
bash
sudo modprobe zram num_devices=1
手动配置 (基于 sysfs)
这是最基础的配置方法,适用于所有发行版。
bash
# 1. 设置压缩算法 (例如 lz4, lzo, zstd)
# 注意:必须在设置 disksize 之前设置
echo lz4 > /sys/block/zram0/comp_algorithm
# 2. 设置 zram 设备大小 (例如 512MB)
echo 512M > /sys/block/zram0/disksize
# 3. 创建 Swap 签名
mkswap /dev/zram0
# 4. 启用 Swap (优先级设为高,确保优先使用)
swapon -p 100 /dev/zram0
使用 zramctl (推荐)
zramctl 是 util-linux 包的一部分,提供了更友好的命令行接口。
bash
# 查找第一个空闲的 zram 设备并初始化 1GB 大小,使用 zstd 算法
sudo zramctl --find --size 1024M --algorithm zstd
# 查看状态
zramctl
Systemd 自动化配置
为了在开机时自动生效,可以创建一个 systemd 服务。
文件:/etc/systemd/system/zram-swap.service
ini
[Unit]
Description=Configure zram swap device
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c 'modprobe zram num_devices=1 && \
echo zstd > /sys/block/zram0/comp_algorithm && \
echo 2G > /sys/block/zram0/disksize && \
mkswap /dev/zram0 && \
swapon -p 100 /dev/zram0'
ExecStop=/usr/bin/bash -c 'swapoff /dev/zram0 && echo 1 > /sys/block/zram0/reset'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
启用服务:
bash
sudo systemctl enable --now zram-swap
内核参数调优
-
vm.swappiness :
由于 zram 比磁盘快得多,我们希望内核更积极地使用 swap。建议将 swappiness 提高到 60-100。
bashsysctl vm.swappiness=100 -
vm.page-cluster :
该参数控制一次从 swap 读取的页数 (2^n)。对于 zram,由于没有磁盘寻道成本,较小的值(0 或 1)可能减少延迟。
bashsysctl vm.page-cluster=0
3. 性能测试数据
基准测试对比
以下数据基于 i5 处理器,8GB RAM 环境下的测试结果。
| 压缩算法 | 压缩率 (Ratio) | 压缩速度 (MB/s) | 解压速度 (MB/s) | 综合评价 |
|---|---|---|---|---|
| LZO | 2.10:1 | 600 | 800 | 兼容性好,老内核默认 |
| LZ4 | 2.05:1 | 850 | 2500 | 速度之王,延迟最低 |
| ZSTD | 2.85:1 | 300 | 900 | 压缩率之王,现代首选 |
实际应用场景
场景:在 2GB 内存的树莓派上编译大型 C++ 项目
- 无 zram: 编译过程中内存耗尽,触发 OOM Killer,编译失败。
- 使用 HDD Swap : 编译成功,但系统严重卡顿,耗时 45分钟。
- 使用 zram (1GB) : 编译成功,系统保持响应,耗时 28分钟。
分析: zram 提供了额外的"虚拟"内存,避免了频繁的磁盘 thrashing,显著提升了 IO 密集型任务在内存受限环境下的性能。
4. 最佳实践
不同场景配置建议
-
桌面环境 / 笔记本电脑:
- 算法 :
zstd(平衡) 或lz4(高性能) - 大小: 物理内存的 50% - 100%
- 目标: 提升多任务处理能力,浏览器多标签页不卡顿。
- 算法 :
-
嵌入式 / IoT 设备 (如树莓派):
- 算法 :
lz4(低 CPU 消耗) - 大小: 物理内存的 50%
- 目标: 防止 SD 卡磨损,延长寿命,避免 OOM。
- 算法 :
-
云服务器 (Web Server / DB):
- 算法 :
zstd - 大小: 物理内存的 25% - 50%
- 目标: 降低内存峰值时的磁盘 IO 压力,节省云盘 IOPS 费用。
- 算法 :
监控与维护
查看实时统计信息:
bash
zramctl
输出示例:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd 2G 500M 150M 160M 4 [SWAP]
- DATA: 原始数据大小 (500M)
- COMPR: 压缩后数据大小 (150M)
- TOTAL: 包括元数据在内的总物理内存占用 (160M)
- 压缩率: 500 / 160 ≈ 3.1 倍
查看详细信息 (sysfs):
bash
cat /sys/block/zram0/mm_stat
常见问题排查
-
无法修改压缩算法:
- 原因:设备已初始化。
- 解决:必须先
swapoff并向/sys/block/zram0/reset写入1重置设备,才能更改算法。
-
系统死机或卡顿:
- 原因:zram 耗尽了所有物理内存,导致系统无法分配内存给进程。
- 解决:设置
mem_limit限制 zram 最大使用的物理内存量,或保留一部分物理内存不被 zram 使用。
-
休眠 (Hibernation) 失败:
- 原因:zram 是易失性存储,不支持挂起到磁盘。
- 解决:如果需要休眠功能,必须保留一个物理磁盘 Swap 分区。