Zram是Linux内核提供的一个功能模块,它会在内存中创建一块虚拟的块设备,写入这块设备的数据会先经过压缩再实际存储。系统可以把这块压缩块设备当作Swap使用,也可以挂载为/tmp目录来减少磁盘写入。对于内存紧张又没有高速磁盘的设备来说,这套机制往往能带来立竿见影的体验提升,Chrome OS和不少安卓手机在出厂时就已经默认启用了它。

Zram的工作原理:用CPU换内存
传统的Swap建立在磁盘或SSD上,内核在物理内存不足时把不活跃的内存页写到磁盘,需要时再读回来。问题在于磁盘的随机读写延迟远高于内存,机械硬盘尤其明显,换页一频繁系统就会卡得不像话。Zram改变了存储位置和存储形态:交换页不再离开内存,而是被压缩后以更小的体积继续留在RAM里。
具体实现上,Zram驱动向上层注册一个标准的块设备,内核的Swap子系统能像使用普通分区一样使用它。向下则连接内核的压缩框架,每个内存页写入时会被切分并压缩存储,读取时再解压还原。由于压缩后的数据通常只有原始大小的三分之一到二分之一,一块4GB的Zram设备实际可能只占用1.5GB左右的物理内存,剩下的空间就能容纳更多活跃数据,等效于扩大了可用内存。
这里的核心权衡是CPU与内存的交换。压缩解压需要处理器计算,但现代CPU执行LZ4这类算法的速度极快,单核每秒可以处理数百MB,相比一次磁盘I/O动辄毫秒级的延迟,CPU开销几乎可以忽略。因此只要压缩算法选得合适,Zram在绝大多数场景下都是净收益。
压缩算法怎么选:LZ4与ZSTD的取舍
内核目前支持多种压缩算法,可以通过下面的命令查看当前系统可用的选项:
cat /sys/block/zram0/comp_algorithm # 典型输出:lzo lzo-rle lz4 lz4hc [zstd] deflate
方括号表示当前生效的算法。实际选择时主要在LZ4和ZSTD之间权衡。LZ4的特点是极快的压缩解压速度,压缩率一般在2到2.5倍之间,适合交互式设备比如笔记本和桌面系统,用户对响应延迟最敏感。ZSTD则提供更高的压缩率,通常能达到3倍以上,代价是压缩阶段消耗更多CPU时间,但它的解压速度依然很快,更适合内存极度紧张、可以接受稍高压缩开销的嵌入式设备。
还有一个影响体验的细节是同名参数same_page_detection,也就是同页去重。开启后,如果写入的页内容全为同一个字节(常见于零填充页),驱动只记录一个标记而不实际压缩,几乎零开销就能释放这类页面。多数发行版的默认配置已经开启了该功能,确认方法如下:
cat /sys/block/zram0/same_pages_merged
如果这个计数持续增长,说明去重正在发挥作用。总体建议是:普通桌面选LZ4追求流畅,路由器、老款开发板这类内存以百MB计的设备选ZSTD榨干每一分容量。
配置实战:从模块加载到参数调优
以Ubuntu和Debian为例,最简单的方式是安装zram-tools包,它提供了zramswap服务并允许通过配置文件控制所有参数:
sudo apt install zram-tools
编辑/etc/default/zramswap文件,设置算法、容量和基于内存的比例:
ALGO=zstd PERCENT=50 PRIORITY=100
保存后重启服务即可生效,PERCENT=50表示Zram设备大小为物理内存的一半,PRIORITY=100保证内核优先使用Zram而不是磁盘Swap。如果发行版没有现成工具,也可以手动操作sysfs接口:
modprobe zram num_devices=1 echo zstd > /sys/block/zram0/comp_algorithm echo 4G > /sys/block/zram0/disksize mkswap /dev/zram0 swapon -p 100 /dev/zram0
注意disksize必须在设备初始化之前设置,且一旦写入无法更改,想调整只能先swapoff再重置设备。
参数调优方面,除了Zram本身,还要配合vm.swappiness。默认值60意味着内核相对积极地换出页面,配合Zram时建议调高到100甚至180(较新内核支持大于100的值),因为换出到Zram的成本很低,更激进地回收不活跃页反而能减少真正的内存压力。可以用下面的命令临时调整并观察效果:
sysctl vm.swappiness=120 sysctl vm.page-cluster=0
page-cluster控制预读的页数,磁盘Swap依赖预读提升吞吐,但Zram没有寻道开销,预读反而浪费内存,设为0更合理。
适用场景与需要注意的限制
Zram并非万能,它最适合的是物理内存有限且Swap换页频繁的设备:小内存笔记本、云服务器低配实例、树莓派等开发板,以及Kubernetes节点上内存限额较紧的容器宿主机。这些场景的共同特点是内存页中存在大量可压缩内容,比如未使用的堆内存、语言运行时的空闲缓冲区等,压缩后收益显著。
反过来,有两种情况不太适合。一是工作负载本身几乎打满CPU,再叠加压缩开销可能得不偿试,需要实测确认。二是内存页不可压缩,例如大量已压缩的多媒体数据或加密数据,此时压缩率接近1比1,Zram等于白白浪费了一块管理开销。可以通过/sys/block/zram0/mm_stat查看原始数据量与实际占用的物理内存,评估真实压缩效果。
还有一个常见误区是把Zram容量设得过大。虽然disksize允许设置为内存的数倍,但物理占用是随实际写入增长的,如果压缩后的总数据加上活跃工作集逼近物理内存总量,系统会陷入OOM。稳妥的做法是从内存的50%起步,观察free -h和swapon --show的输出,再逐步上调。只要参数调得合理,Zram几乎是小内存Linux设备上性价比最高的一项优化,值得每个运维者和桌面用户亲手试一次。
ZramLinux Swap内存优化修改时间:2026-09-03 06:08:39