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 预算与数据可压缩性判断,不建议在未评估的情况下同时叠加。