
Linux zram 实战指南5 步配好压缩换页设备看懂 3 个核心指标【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux服务器内存不够、又不想让 Swap 落到机械盘上zram 是 Linux 内核提供的一个压缩块设备把不活跃的内存页压缩后仍放在内存里从而在不增加硬件的前提下多出可用的交换空间。它读写只发生在 RAM 中延迟通常比磁盘 Swap 低一个数量级以上代价是消耗一些 CPU。本文按先跑起来 → 再读指标 → 最后排障的顺序展开所有命令与属性名均可在内核源码树中核对。zram 是什么给内存页加了一层压缩存档可以这样理解普通 Swap 是把内存页搬出 RAM 写到磁盘zram 则是把内存页压缩后留在 RAM 里。内核创建虚拟块设备/dev/zramXX 0、1、…写入这些设备的数据页会被压缩存储压缩由 zsmalloc 分配器管理每个压缩对象按实际大小分配空间因此压缩率越高真正占用的物理内存越少当进程再次访问被换出的页时zram 解压并原样写回整个过程对应用透明这个设计在 Kconfig 中有明确描述这类设备 allow very fast I/O and compression provides good amounts of memory savings典型用途就是 swap 和 /tmp 之类的临时存储。最小可用方案5 步配好 zram swap以下以zram0为例。如果系统已有设备很多发行版会预建先跳过第 1 步# 1. 查看是否已有 zram 设备 ls /dev/zram* # 2. 没有则新建一个内核 4.2 支持热添加输出即设备号 echo 1 /sys/class/zram-control/hot_add # 3. 查看并选择压缩算法此时设备还未初始化 cat /sys/block/zram0/comp_algorithm # 列出所有可用算法默认项带 [ ] echo zstd /sys/block/zram0/comp_algorithm # 4. 设定容量单位字节支持 K/M/G 后缀表示可存入未压缩数据的上限 echo 1G /sys/block/zram0/disksize # 5. 格式化为 swap 并启用 mkswap /dev/zram0 swapon /dev/zram0验证是否生效swapon --show # 应看到 zram0 条目 free -h # Swap 行出现非零容量有一个容易踩的坑算法必须在disksize初始化之前设置。源码里comp_algorithm_store会检查设备状态已初始化的设备返回-EBUSY并打印 Cant change algorithm for initialized device见 drivers/block/zram/zram_drv.c。想换算法时先swapoff /dev/zram0再echo 1 /sys/block/zram0/reset然后重新走第 3、4 步。读指标先看 mm_stat 和 io_stat 两个文件zram 的统计通过 sysfs 暴露最常用的是/sys/block/zram0/下的两个文件cat /sys/block/zram0/mm_stat cat /sys/block/zram0/io_statmm_stat有 6 个字段单位都是页数字段含义用法orig_data_size存入的原始数据量分母/分子算压缩率compr_data_size压缩后数据量压缩率 上一列 ÷ 本列compr_data_storage_size含元数据的存储占用更贴近真实开销mem_usedzram 当前实际占用的物理内存页判断真正省了多少mem_limit内存上限未设置则为 0配合mem_limit属性使用max_used历史峰值占用写 0 到/sys/block/zram0/mem_used_max可清零由此可以算出两个最有价值的数# 压缩率orig / compr awk {printf %.2f\n, $1/$2} /sys/block/zram0/mm_stat # 实际节省的内存原始量 - 当前占用单位 4K 页 awk {print ($1-$4)*4/1024 MB} /sys/block/zram0/mm_statio_stat有 3 个字段failed_reads、failed_writes、notify_free。后两个通常为 0只要failed_reads大于 0说明有换出页被销毁过比如设备被 reset 或容量写满意味着部分进程数据已丢失应立即排查。另有一个debug_stat文件格式未做文档化、随时可能变化仅供内核开发者调试监控系统不必采集。所有属性的完整说明见内核自带的 ABI 文档Documentation/ABI/testing/sysfs-block-zram。怎么判断 zram 状态正常一份参考阈值表观察项正常参考值异常信号压缩率2.0 以上常见纯压缩数据约 1.0持续 1.2 以下说明数据天然难压缩disksize使用率低于 70%接近 100%新换页写不进去mem_used与mem_limit留 20% 余量触碰上限换页开始失败io_stat的failed_reads恒为 0非 0 发生过数据丢失max_used趋势平稳单调上涨接近峰值容量规划不足阈值是经验值建议结合自己的业务负载跑几天再定告警线不要照抄。算法怎么选速度、压缩率、CPU 的三角平衡cat /sys/block/zram0/comp_algorithm输出里带[ ]的是当前默认值。主线内核的编译期默认是lzo-rle实际可用列表取决于你的内核配置ZRAM_BACKEND_LZ4、ZRAM_BACKEND_ZSTD等见 drivers/block/zram/Kconfig。常见选择算法定位适用场景lz4压缩解压都极快压缩率一般CPU 紧张、追求低延迟lzo/lzo-rle均衡主线默认通用场景、拿不准时lz4hc比 lz4 压缩率更高CPU 开销略增想在快速档里多省一点内存zstd压缩率最高CPU 开销也最高内存极度紧张、CPU 有余量deflate、842传统备选特定环境兼容需求判断依据很简单先看压缩率是否达标达标了再比 CPU 占用用top观察 kworker 或整机 use%。压缩率不够就换更强的算法CPU 超预算就退到更轻的算法而不是无脑调大小。按症状排障换页量很小、没省多少内存先看压缩率。低于 1.3 通常不是 zram 的问题而是数据本身难压缩图像、已压缩文件、加密数据。可以换zstd重试如果内核开了CONFIG_ZRAM_WRITEBACK还可以把不可压缩页回写到后备设备腾出 RAMecho /dev/sdb1 /sys/block/zram0/backing_dev echo 1 /sys/block/zram0/idle # 标记空闲页 echo 1 /sys/block/zram0/writeback # 触发回写CPU 占用明显升高压缩发生在写路径。对策改用lz4或调小disksize减少换页总量也可给mem_limit设上限限制 zram 最多吃多少物理内存。设备满了orig_data_size接近disksize时新写入会失败。调大disksize设备未 reset 时可反复写或先echo 1 /sys/block/zram0/reset清空后重新初始化。可用空间够但分配失败碎片zsmalloc 按对象大小分桶长期运行可能产生碎片。触发一次整理echo 1 /sys/block/zram0/compact想对已换出的页再压一遍较新内核的CONFIG_ZRAM_MULTI_COMP支持二级算法先快算法换出、再对空闲页用慢算法重压缩兼顾速度和比率echo zstd /sys/block/zram0/recomp_algorithm echo 1 /sys/block/zram0/recompressfailed_reads非 0说明有页被读回时找不到数据。常见原因有人 reset 了设备、disksize 溢出后状态异常。处理确认当前 swap 状态必要时swapoff→reset→ 重新初始化并检查是否有脚本周期性误操作 zram。进阶入口源码、文档与自测想深入时按下面顺序看驱动主逻辑drivers/block/zram/zram_drv.c所有 sysfs 属性的读写实现都在这里压缩对象池在 drivers/block/zram/zcomp.c压缩后端backend_lz4.c、backend_zstd.c等都在 drivers/block/zram/ 目录底层算法库在 lib/lz4/ 与 lib/zstd/官方使用文档Documentation/admin-guide/blockdev/zram.rst涵盖 writeback、内存跟踪等高级功能内核自带自测脚本tools/testing/selftests/zram/可直接运行验证你的内核配置是否完整编译开关CONFIG_ZRAM是总开关CONFIG_ZRAM_WRITEBACK、CONFIG_ZRAM_MULTI_COMP、CONFIG_ZRAM_MEMORY_TRACKING分别对应回写、多算法重压缩、debugfs 状态跟踪小结zram 的价值在于把内存不够这个问题从加硬件变成了调配置配置路径很短hot_add→ 选算法 → 设disksize→mkswapswapon状态看两个文件就够mm_stat算压缩率和真实占用io_stat抓数据丢失调优围绕一个三角压缩率、CPU、容量按症状取舍而不是盲目改参数算法只能在初始化前设置reset是重新配置的前提先把 zram 当作一层内存里的压缩缓存来使用指标读得明白后面换算法、开 writeback 都只是配置层面的动作。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考