Linux系统没有全局“内存压缩率”,zram压缩效率需通过/sys/block/zram*/下orig_data_size与compr_data_size计算,公式为(orig_data_size−compr_data_size)/orig_data_size×100%,zramctl仅显示近似值,不可用于精确统计。

zram 是 Linux 内核中实现内存压缩的核心机制,但“系统内存压缩率”这个概念本身容易误解——Linux 没有全局统一的“内存压缩率”指标,也没有类似 gzip -l 那样直接输出一个百分比的命令。实际能查到的是压缩设备(如 /dev/zram0)的运行时统计,它反映的是 该 zram 设备上已压缩页面的效率,而非整个系统的内存压缩比例。
真正可查、有意义的指标藏在 /sys/block/zram*/ 下,需结合具体设备判断。
怎么查 zram 设备的压缩统计(/sys/block/zram*)
系统启用 zram 后,每个 zram 设备(如 zram0)会在 /sys/block/ 下暴露一组只读统计文件。关键字段不是“压缩率”,而是:
-
orig_data_size:原始未压缩数据总字节数(即所有被压缩页面解压后的大小) -
compr_data_size:当前压缩后实际占用的字节数 -
mem_used_total:zram 后端实际分配的内存总量(含元数据、对齐开销等)
所以,单个 zram 设备的「有效压缩比」只能近似计算为:compr_data_size / orig_data_size(越小越好),或反向表达为压缩节省率:(orig_data_size - compr_data_size) / orig_data_size * 100%
实操命令示例(假设 zram0 已启用):
echo "压缩节省率: $(awk 'BEGIN{printf "%.1f%", (1-$2/$1)*100}' \
/sys/block/zram0/mm_stat /sys/block/zram0/mm_stat)注意:/sys/block/zram0/mm_stat 是一行 6 列数字,第 1 列是 orig_data_size,第 2 列是 compr_data_size。上面 awk 脚本取的是第 1 和第 2 列。
为什么 cat /proc/meminfo | grep -i compress 查不到压缩率
/proc/meminfo 中只有 CompressedPages(已压缩页数)和 Zswap 相关字段(如 Zswapped),但没有原始/压缩字节数。Zswap 是另一种内存压缩机制(压缩后暂存于 swap 设备),其统计更粗粒度,仅提供 Zswapped(压缩页数)和 Zswaped(已写入 swap 的压缩页数),无法推算字节级压缩比。
常见错误现象:
- 执行
grep compress /proc/meminfo返回空或只有CompressedPages数值,误以为这就是“压缩率” - 把
CompressedPages和总内存页数相除,得出一个无意义的“页面压缩率”——页面是否压缩与内容无关,且未压缩页也可能驻留内存
zramctl 能显示什么?
zramctl(来自 util-linux)是管理 zram 设备的工具,但它**不输出压缩率**,只显示配置和基础状态:
zramctl # 输出类似: NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram0 lzo-rle 512M 1.2G 197M 214M 4 [SWAP]
其中:
-
DATA≈orig_data_size(单位自动换算,精度有限) -
COMPR≈compr_data_size(同上) -
TOTAL≈mem_used_total
所以你可以手动算:197M / 1.2G ≈ 16.4%,即压缩后体积约为原始数据的 16%,相当于 **84% 的空间节省**。但要注意:zramctl 的 DATA 和 COMPR 是四舍五入显示,不适合精确计算。
别混淆 zram 和 zswap 的统计口径
两者都做内存压缩,但设计目标和统计方式完全不同:
-
zram:压缩数据保存在 RAM 中一块专用区域,统计精确到字节,适合查压缩效率 -
zswap:压缩数据暂存于 swap 设备(可能是磁盘或 NVMe),只记录压缩页数和写入次数,/sys/kernel/debug/zswap/下的same_filled_pages、stored_pages等字段无法换算出字节级压缩比
如果你启用了 zswap 而非 zram,/sys/block/zram* 根本不存在,此时谈“内存压缩率”就失去了可测量的基础。
实际使用中,真正需要关注的不是某个百分比数字,而是:compr_data_size 是否显著小于 orig_data_size,以及 mem_used_total 是否接近 compr_data_size(说明元数据开销低)。压缩算法(LZ4/ZSTD/LZO)的选择、内存压力水平、页面访问模式,都会让这个比值动态变化——它不是一个静态配置项,而是一个运行时观测结果。


















