内存与 OOM58 条

zram 压缩内存交换

把一部分内存做成压缩块设备当 swap 使用:换出页压缩存放,减少真实磁盘 IO,用 CPU 换内存,适合内存紧张而 CPU 富余的场景。

zram 是什么

zram 把一部分物理内存虚拟成压缩块设备,用它作为 swap 时,换出的页会先被压缩后存放,从而避免真实磁盘 IO——本质是用 CPU 时间换内存空间。它适合内存紧张而 CPU 有余量的场景(小规格云主机、容器宿主、边缘设备)。实际收益取决于数据可压缩程度与压缩算法开销,不能用标称容量当作可用内存的直接增量。

基本信息

适用平台Linux(多数发行版内置 zram 模块)
典型流程modprobe zram → 设置 disksize → mkswap → swapon
管理工具zramctl(列出设备、算法、大小与用量)
统计文件/sys/block/zram0/mm_stat
配置集成发行版常提供 zram-generator 或相关服务自动配置
顺序约束disksize 必须在设备启用之前设置

典型使用场景

  • 小规格实例提升可承载负载:用压缩交换换取更大的有效内存
  • 容器宿主缓解内存压力,同时避免引入磁盘 swap 的 IO 抖动
  • 边缘设备与单板机延长可用内存,代价是增加 CPU 负载
  • 替代磁盘 swap 改善换页延迟,尤其在没有高速存储的机器上
  • 测试环境快速获得换页空间,验证应用在内存受限下的行为

手动配置示例

手动配置示例
sudo modprobe zram  # 加载模块并创建 /dev/zram0
sudo sh -c 'echo 2G > /sys/block/zram0/disksize'  # 设置设备大小,必须在启用前完成
sudo mkswap /dev/zram0  # 写入 swap 签名
sudo swapon -p 100 /dev/zram0  # 以较高优先级启用,优先于磁盘 swap
zramctl  # 查看设备名、算法、大小与当前用量
cat /sys/block/zram0/mm_stat  # 原始数据量、压缩后大小与实际内存占用
grep -E 'pswpin|pswpout' /proc/vmstat  # 观察换页计数,确认确实在被使用

指标读法

字段含义判读要点
DATA写入的原始数据量反映换出总量
COMPR压缩后数据大小越小说明压缩效果越好
TOTAL实际占用的内存(含元数据)这才是真实的内存代价
ALGORITHM压缩算法(如 zstd、lzo-rle)影响 CPU 开销与压缩比
STREAMS压缩流数量多核场景下影响并行处理能力
disksize 只能在设备尚未启用时设置,顺序错误会报设备忙。要修改大小需先 swapoff,再重置设备后重新配置,不能直接覆盖正在使用的设置。
压缩比与数据特征强相关:文本类数据压缩收益明显,已压缩或加密过的数据几乎没有收益。评估效果应看 mm_stat 里的实际占用与 CPU 使用率变化,而不是只看 disksize。

易错点

  • 设置顺序错误:先启用再改 disksize 会失败,误以为设备不支持调整
  • 把 disksize 当成凭空多出的内存:zram 占用真实内存,只是压缩存放,判断收益要看 TOTAL
  • CPU 已经很紧张时引入 zram:压缩解压开销会进一步挤占算力,延迟可能不降反升
  • 忘记持久化配置:重启后设备与 swap 消失,需借助发行版提供的 zram 配置工具固化
  • 与 zswap 同时启用:两层压缩机制叠加,收益与开销都难以归因,排障成本上升

数据来源与参考

  • Linux 内核 Documentation/admin-guide/blockdev/zram.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌