Linux zram 压缩内存实战指南:从查状态到配好 swap 优化,一次讲全

发布时间:2026/8/29 12:47:52
Linux zram 压缩内存实战指南:从查状态到配好 swap 优化,一次讲全 Linux zram 压缩内存实战指南从查状态到配好 swap 优化一次讲全【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux凌晨两点监控群弹出告警一台 8GB 内存的服务器可用内存跌破 200MB接口响应时间从 30ms 爬到 800msswap in/out 每秒几千次磁盘 I/O 打满。查了一圈业务本身没有内存泄漏只是缓存和短生命周期对象把内存吃得太紧。后来我们把磁盘 swap 换成了 Linux 内核自带的 zramI/O 等待基本消失这台机器就再没半夜叫过。30秒看懂 zramzram 是 Linux 内核里的一个块设备驱动代码在 drivers/block/zram/。它做的事用一句话说把 swap 从磁盘搬进内存页写入前先压缩读取时再解压。省下的空间就是压缩比换出来的。和磁盘 swap 相比zram 的读写都发生在内存里延迟差出几个数量级代价是压缩和解压要吃一点 CPU。第一步3分钟确认 zram 状态多数发行版默认没启用 zram先确认内核加载了驱动ls /sys/block/zram* 2/dev/null cat /proc/swaps如果已经启用核心数据都在 sysfs 下两个文件值得看cat /sys/block/zram0/disksize cat /sys/block/zram0/mm_statmm_stat是逗号分隔的数字序列前两项是关键。对照表如下指标位置含义disksize/sys/block/zram0/disksize设备容量上限指可存放的未压缩数据总量原始大小 orig_data_sizemm_stat第 1 项已写入 zram 的页压缩前一共多大压缩后大小 compr_data_sizemm_stat第 2 项这些页压缩后实际占用的内存读次数 readsmm_stat第 3 项进程从 zram 取回过多少页越高说明换入越频繁写次数 writesmm_stat第 5 项多少页被压缩送进过 zram用第 1 项除以第 2 项就是当前 zram 压缩率。压缩率低于 1.2 时说明换进去的数据基本压不动收益有限。算法与大小两个关键配置驱动支持多种压缩后端源码里能直接看到backend_lz4.c、backend_lzo.c、backend_zstd.c均位于 drivers/block/zram/取舍逻辑很简单lz4速度最快压缩率最低CPU 最省。内存紧张到出现卡顿、而 CPU 还富裕的机器先选它。lzo速度接近 lz4压缩率略高是老牌默认选择。zstd压缩率明显更高CPU 开销也更高。内存特别紧张、CPU 有余量时优先考虑。换算法只需要写入comp_algorithm但要等下一次重置设备后生效。完整配置流程如下echo 4G /sys/block/zram0/disksize echo zstd /sys/block/zram0/comp_algorithm echo 1 /sys/block/zram0/reset mkswap /dev/zram0 swapon -p 10 /dev/zram0大小建议取物理内存的 1/4 到 1/2。disksize 限的是未压缩数据上限不是占用的物理内存设大一点不会多占内存只会让压缩页可能更多。swapon -p 10把优先级调高让内核优先往 zram 换、磁盘 swap 只做兜底。踩坑与排错现象、原因、处理现象CPU 使用率里si/so软硬上下文切换与中断明显升高整机卡顿。原因zram 的每次读写都要做一次压缩或解压换页太频繁等于用 CPU 换 I/O换过头了。处理把 disksize 调小让部分页落到磁盘 swap 兜底或者从 zstd 换回 lz4。现象开了 zram压缩率只有 1.05 左右内存没省出多少。原因换进去的页本身不可压缩随机数、加密数据或者业务内存占用平稳根本没多少页进 swap。处理先确认mm_stat里 writes 是否持续增长如果增长少说明瓶颈不在 swap方向应转向业务内存或加大物理内存而不是继续调 zram。现象zram 写满了新页换不进去性能反而变差。原因disksize 设得偏小或者压缩率不及预期。处理调大 disksize 并 reset 设备如果压缩率确实低考虑把不可压缩页写回磁盘内核的 writeback 特性文档见 Documentation/admin-guide/blockdev/zram.rst。收尾5项自查清单 ✅部署或排查 zram 前照这个清单过一遍/proc/swaps里 zram 在列且优先级高于磁盘 swapdisksize 为物理内存的 1/4 到 1/2不是拍脑袋的数字mm_stat压缩率稳定在 1.2 以上低于则怀疑数据不可压缩reads/writes 增速与业务曲线匹配持续暴涨说明内存水位偏低CPU 没有因为压缩/解压出现持续 20% 以上的额外占用zram 不是一个装上就完事的开关压缩率和换页频率这两个数字值得定期看一眼它们直接告诉你这台机器该加内存、换算法还是什么都不用做。进一步阅读驱动源码 drivers/block/zram/、sysfs 属性说明 Documentation/ABI/testing/sysfs-block-zram、官方文档 Documentation/admin-guide/blockdev/zram.rst。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考