内存与 OOM58 条

zswap 前端压缩缓存

换出页先进入压缩内存池,命中则免去磁盘写;池满后按策略回写后端 swap,属于“前置换出缓存”机制。

zswap 是什么

zswap 位于换出路径的前端:页在被真正写入 swap 设备之前,先尝试压缩并放进内存中的压缩池,放得下就完全不产生磁盘写;池满时再按策略把较早的页回写到后端 swap 设备。因此它需要有后端 swap 才有意义,本质是「换出缓存」而不是独立的交换空间,与本身就是压缩块设备的 zram 属于不同实现层次。

基本信息

参数目录/sys/module/zswap/parameters/
开关enabled(Y/N)
常用参数compressor(压缩算法)、max_pool_percent(池占用上限)、zpool(池实现)
统计文件/sys/kernel/debug/zswap/ 下的池统计(需挂载 debugfs)
前提条件必须存在可用的后端 swap 设备
持久化内核命令行 zswap.enabled=1 等方式;运行时写入重启即失效

典型使用场景

  • 已配置磁盘 swap,希望降低实际磁盘写入量、改善换出性能
  • SSD 寿命敏感的环境,减少换出带来的写入磨损
  • 评估压缩换出对本机负载的实际收益,与 zram 方案做对照
  • 内存紧张但 CPU 有余量的服务器,用压缩缓冲换取响应速度
  • 排查换出抖动:确认页是被压缩在内存里还是真的落盘

查看与启用

查看与启用
cat /sys/module/zswap/parameters/enabled  # 当前开关状态(Y/N)
cat /sys/module/zswap/parameters/compressor  # 使用的压缩算法
cat /sys/module/zswap/parameters/max_pool_percent  # 压缩池可占用的内存比例上限
echo Y | sudo tee /sys/module/zswap/parameters/enabled  # 运行时启用,重启失效
sudo cat /sys/kernel/debug/zswap/pool_total_size 2>/dev/null  # 池当前占用
swapon --show  # 确认后端 swap 存在,否则 zswap 不会实际工作
grep -E 'pswpin|pswpout' /proc/vmstat  # 对照换出计数,判断磁盘写是否被减少

参数与统计

参数/文件含义调优影响
enabled总开关(Y/N)关闭后换出直接落盘
compressor压缩算法(如 lz4、zstd)影响 CPU 开销与压缩比
zpool压缩池实现(如 zbud、zsmalloc)影响内存占用效率与并发能力
max_pool_percent压缩池可占用的内存百分比上限设得过大反而挤占可用内存
pool_total_size池当前实际占用(debugfs)结合算法压缩比评估收益
没有后端 swap 设备时 zswap 不会真正工作。启用前先用 swapon --show 确认存在交换设备,否则会误判为「机制无效」。
zswap 与 zram 是两种层次的方案:zram 自身就是压缩块设备,zswap 是换出路径上的前端缓存。选型时结合是否有磁盘 swap、CPU 预算与数据可压缩性判断,不建议在未评估的情况下同时叠加。

易错点

  • 没有后端 swap 就启用:机制不会生效,白花时间排障
  • 只看 enabled 不看统计:无法判断压缩是否命中、回写是否发生,也就无法评估收益
  • max_pool_percent 设得过大:压缩池占用过多物理内存,反而加剧整体压力
  • 与 zram 同时启用:两层压缩叠加后收益与开销难以归因,故障定位变复杂
  • 以为统计文件必然存在:debugfs 未挂载时读不到池统计,需先挂载再判断

数据来源与参考

  • Linux 内核 Documentation/admin-guide/mm/zswap.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌