zram 技术详解与实战指南
1. 技术原理
什么是 zram
zram(最初称为 compcache)是 Linux 内核中的一个模块,它在 RAM 中创建一个压缩的块设备。当数据写入该设备时,数据会被实时压缩并存储在内存中;当读取数据时,数据会被解压缩。
介绍 Linux 内核中的 zram 技术原理、工作机制及与传统 Swap 的区别,涵盖配置部署方式、性能优化策略和实际应用案例,提供针对不同场景的最佳实践建议与故障排查方法。

zram(最初称为 compcache)是 Linux 内核中的一个模块,它在 RAM 中创建一个压缩的块设备。当数据写入该设备时,数据会被实时压缩并存储在内存中;当读取数据时,数据会被解压缩。
zram 最常见的用途是作为 Swap(交换分区)。通过将内存中的冷数据压缩后存回内存,而不是写入缓慢的磁盘,zram 可以显著提高系统的响应速度,尤其是在内存受限的设备(如嵌入式系统、旧电脑、入门级云主机)上。
zram 的核心流程如下:
zsmalloc 分配器将压缩后的数据存储在物理内存中。| 特性 | 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 内存分配器管理内存池。
zram 自 Linux 3.14 起已合并入主线内核,大多数现代发行版默认已编译该模块。
检查内核模块:
modinfo zram
加载模块:
sudo modprobe zram num_devices=1
这是最基础的配置方法,适用于所有发行版。
# 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 是 util-linux 包的一部分,提供了更友好的命令行接口。
# 查找第一个空闲的 zram 设备并初始化 1GB 大小,使用 zstd 算法
sudo zramctl --find --size 1024M --algorithm zstd
# 查看状态
zramctl
为了在开机时自动生效,可以创建一个 systemd 服务。
文件:/etc/systemd/system/zram-swap.service
[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
启用服务:
sudo systemctl enable --now zram-swap
vm.page-cluster:
该参数控制一次从 swap 读取的页数 (2^n)。对于 zram,由于没有磁盘寻道成本,较小的值(0 或 1)可能减少延迟。
sysctl vm.page-cluster=0
vm.swappiness:
由于 zram 比磁盘快得多,我们希望内核更积极地使用 swap。建议将 swappiness 提高到 60-100。
sysctl vm.swappiness=100
以下数据基于 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 提供了额外的'虚拟'内存,避免了频繁的磁盘 thrashing,显著提升了 IO 密集型任务在内存受限环境下的性能。
zstd (平衡) 或 lz4 (高性能)lz4 (低 CPU 消耗)zstd查看实时统计信息:
zramctl
输出示例:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd 2G 500M 150M 160M 4 [SWAP]
查看详细信息 (sysfs):
cat /sys/block/zram0/mm_stat
swapoff 并向 /sys/block/zram0/reset 写入 1 重置设备,才能更改算法。mem_limit 限制 zram 最大使用的物理内存量,或保留一部分物理内存不被 zram 使用。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online