十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

5 分钟跑通 zram:Linux 内存优化、监控与排障避坑指南

5 分钟跑通 zram:Linux 内存优化、监控与排障避坑指南 5 分钟跑通 zramLinux 内存优化、监控与排障避坑指南【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linuxzram 把不活跃的内存页在 RAM 内压缩存放用压缩块设备代替磁盘 swap是应对内存紧张的快速手段。本文讲清 zram used_mem 监控口径、压缩比与写回配置以及常见问题排查面向有 Linux 基础但不读内核源码的读者。一个真实的内存告急现场凌晨三点一台 4GB 的实例被打满top里 si/so 飙到 50、100free -h中 swap 快满dmesg滚出 OOM 记录业务线程全卡在做交换。扩容之前其实可以先问一句这些被换出的页有多少能在内存里直接压下去这就是 zram 的活。5 分钟上手把 zram 跑起来zram 由drivers/block/zram/驱动实现会创建/dev/zram0这类纯 RAM 块设备写进去的页先压缩再落盘读取也快因为根本不碰磁盘。加载模块、选算法、设大小、挂 swap四步走modprobe zram num_devices1 cat /sys/block/zram0/comp_algorithm echo lz4 /sys/block/zram0/comp_algorithm echo 512M /sys/block/zram0/disksize mkswap /dev/zram0 swapon /dev/zram0第一段输出里方括号标出当前算法cat即可查看全部候选。注意两点算法只能在disksize初始化之前改disksize一般别超过物理内存的两倍——压缩比按 2:1 估算开太大只会浪费。看懂内存账本used_mem 与 mm_stat先说避坑/sys/block/zram0/used_mem这个节点在 5.9 之后的内核里已经合并进mm_stat所以监控 zram 实际占用读mm_stat第三列就对了。下面这条命令一次打印三个关键值并算出压缩比awk {printf used%dMB orig%dMB compr%dMB ratio%.2f\n, $3/1048576, $1/1048576, $2/1048576, $1/$2} /sys/block/zram0/mm_statmm_stat各字段如下均为单行空格分隔字节为单位字段定义以官方文档为准Documentation/admin-guide/blockdev/zram.rst字段单位含义判断参考orig_data_size字节未压缩数据总量与 compr 相除即压缩比compr_data_size字节压缩后实际占用比值 1.5 说明算法不匹配mem_used_total字节总分配量含碎片与元数据它就是历史上的 used_memmem_limit字节内存上限0 为不限制未设置时留意峰值mem_used_max字节历史峰值逼近 mem_limit 要扩容或写回same_pages页数同值页不占内存纯白页越多越好pages_compacted页数内存整理释放的页数触发 compact 后看变化huge_pages页数当前不可压缩页持续增长考虑写回huge_pages_since页数启动以来不可压缩页总数配合 huge 看增速经验阈值健康压缩比在 2:1 左右mem_used_total长期超过compr_data_size的 1.5 倍说明碎片或元数据开销偏高可用echo 1 /sys/block/zram0/compact整理后再读一次对比。调优三板斧算法、内存上限与写回策略先选算法cat /sys/block/zram0/comp_algorithm echo zstd /sys/block/zram0/comp_algorithm选型一句话吞吐敏感选lzo/lz4内存极度紧张、愿意多花点 CPU 选zstd。改完用上一节的压缩比公式验证数字说话。再设内存上限echo 256M /sys/block/zram0/mem_limit给 zram 的分配画一条天花板防止它挤占前台应用该值支持运行期随时修改不写或写 0则不设限。何时该用多租户共享内存、或 zram 与数据库争抢内存的机器上。最后配写回echo /dev/sda5 /sys/block/zram0/backing_dev echo huge /sys/block/zram0/writeback第一条必须在disksize之前执行且只支持分区。writeback的取值huge只挪走不可压缩页idle挪走冷页huge_idle两者都挪——何时该用mm_stat里huge_pages占比高、或希望冷数据最终落盘以释放内存时。排障速查Q压缩比低于 1.5怎么查A读mm_stat看huge_pages占比。不可压缩数据天然压不动先换更强的算法comp_algorithm压不动的部分再走写回。Qused 只涨不降A对照orig_data_size。数据量没涨而mem_used_total涨怀疑泄漏走上游报障两者一起涨说明交换活跃属正常调大mem_limit或开writeback兜底。Q交换 I/O 失败A看io_stat的failed_reads/failed_writes两列cat /sys/block/zram0/io_stat非零时优先检查mem_limit是否卡死分配、disksize是否超卖。Qmem_used_max逼近上限A写mem_used_max文件可清零峰值计数但真正的处理是扩mem_limit或把冷页写回后端。进阶可选读两个功能默认都关闭需要对应内核配置CONFIG_ZRAM_MEMORY_TRACKING打开后/sys/kernel/debug/zram/zram0/block_state逐块输出访问时间加状态位s同值页、h不可压缩、i空闲、r已重压缩、n全算法失败配合 pagemap 能定位到具体进程的冷页。CONFIG_ZRAM_MULTI_COMP打开后可用recomp_algorithm指定次级算法再执行echo typeidle priority1 /sys/block/zram0/recompress让空闲页用更高压缩比重压一遍——适合夜间低峰期跑进一步压低mem_used_total。收尾把它变成日常动作思路一句话先用 zram 在内存里消化冷页再用mm_stat持续验证压缩效果最后用限流与写回兜底。建议每天 30 秒扫一眼压缩比、mem_used_max、io_stat失败计数三项任一异常就按上面的速查表处理。字段细节与高级特性查官方文档 Documentation/admin-guide/blockdev/zram.rst 即可。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表