
zram 内存压缩 Swap 完整指南10 分钟吃透指标与调优动作【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux凌晨三点服务器内存被吃满磁盘 swap 开始狂转页面故障排队几毫秒起步。内核里的 zram 可以改变这件事它是个压缩块设备——把冷数据压缩后塞回内存里存着换页不再等磁盘。本文从 Linux 内核的 zram 驱动讲起覆盖工作原理、指标读法与生产调优动作。zram 是怎么把冷页压回内存的zram 在/dev/zram0这类设备上实现了块设备接口数据却只存在内存里。一次完整的换页过程按下面几步走内存紧张时回收路径挑出长时间不活跃的匿名页该页被写入 zram 设备驱动调用zcomp框架里的压缩后端lz4、zstd 等压缩压缩后的字节存进 zsmalloc 内存池原页面物理内存归还系统进程再次访问时触发读请求zram 原地解压返回全零页干脆不存直接记一笔。因为读写全程在 RAM 里完成延迟比磁盘 swap 低一到两个数量级代价是压缩和解压消耗 CPU。指标怎么读一张表看懂 /sys/block/zram0所有状态都挂在 sysfs 下字段权威定义见Documentation/ABI/testing/sysfs-block-zram文件含义什么时候看disksize容量上限单位是未压缩数据量初始化前设置comp_algorithm当前压缩算法初始化后不可再改初始化前选择mm_stat9 列核心数据原始大小 / 压缩后大小 / 实际占用 / mem_limit / 峰值占用 / 相同页计数等日常监控主力io_stat失败读、失败写、notify_free 次数排查异常mem_used_max历史峰值内存占用写 0 复位观察增长趋势idle/writeback把冷页回写到 backing 磁盘需编译开关高级用法压缩率就是mm_stat前两列相除DEV/sys/block/zram0 cat $DEV/mm_stat # 前两列依次为原始数据大小、压缩后大小 awk {printf 压缩率: %.2f 节省: %sMB\n, $1/$2, ($1-$2)/1048576} $DEV/mm_stat经验区间压缩率 1.5~3 属健康低于 1.3 说明数据可压缩性差或算法没选对。三步上手用 zramctl 启用内存 swap大多数发行版装了 util-linux 后就有zramctlzramctl /dev/zram0 -s 1G -a lz4 # 建 1G 设备选 lz4 算法 mkswap /dev/zram0 swapon -p 10 /dev/zram0 zramctl -v # 查看状态容量怎么定一般取物理内存的 25%~50%。它限制的是未压缩数据总量实际占用的 RAM 通常只有标称的几分之一。想更省事也可以直接写 sysfs 按官方文档Documentation/admin-guide/blockdev/zram.rst里的步骤走。常见坑与三个调优动作现象可能原因动作CPU 偏高高压缩比算法 换页频繁换 lz4调小 disksize压缩率 1.3算法与数据不匹配换 zstd查业务内存画像占用接近上限碎片或容量不够写compact触发整理调大 disksize算法选型对照lz4 最快但省得少zstd 省得最多但更耗 CPUlz4hc/lzo 居中。算法只能在初始化前选切换必须先 resetcat /sys/block/zram0/comp_algorithm # 看可选列表括号内为当前 echo 1 /sys/block/zram0/reset echo zstd /sys/block/zram0/comp_algorithm echo $((2*1024**3)) /sys/block/zram0/mem_limit # 限内存0不限mem_limit容易被忽略默认 zram 可以无限占用 RAM给压缩池设个上限避免极端场景把应用内存挤没。源码地图内核里 zram 代码在哪读drivers/block/zram/zram_drv.c主驱动sysfs 属性、读写路径、mm_stat_show都在这里drivers/block/zram/zcomp.c与backend_*.c压缩抽象层和各算法适配器Documentation/admin-guide/blockdev/zram.rst官方使用说明与错误码表Documentation/ABI/testing/sysfs-block-zram每个 sysfs 字段的行为定义读代码时从mm_stat_show的 9 列格式入手对照上表半小时就能把指标和内核字段一一对上。今晚就能做modinfo zram确认内核带驱动没有就modprobe zram建一个 1G 的 zram0 挂成 swap跑半天业务读一次mm_stat把压缩率算出来留底给mem_limit设个上限如物理内存 20%把mm_stat前两列纳入你的监控采集占用逼近mem_limit时告警【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考