Swap 为 Linux 中适合换出的页面提供后备存储,让暂时不需要驻留的数据离开物理内存,把 RAM 留给活跃工作。但它不会让超出容量的工作集继续拥有内存访问速度。真正要问的是:回收是否腾出了空间,同时没有反复阻塞重要任务。交换占用、交换流量与应用进展,分别回答这个问题的一部分,不能拿其中一个数字概括全部情况。
分清哪些页面可以移动
匿名内存经常使用交换,但并非唯一情况。配置允许时,tmpfs 和共享内存页面也能换出。普通文件支撑的干净页面通常可以丢弃,以后从原文件重读;脏文件页则需要适当写回。并非所有分配都可以回收,被锁定而禁止换页的内存还有另外约束。因此,“所有 malloc 分配的东西”不足以描述内核实际上能够移走哪些内容。
vm.swappiness 在零到二百的文档范围内,表达交换与文件系统换页之间的相对成本;它不是达到某个 RAM 使用百分比后才开启交换的阈值。设为零也不等于在所有情形下禁用交换。如果压缩交换或更快的交换设备比文件系统换页便宜,大于一百的值可能合理,但适当取值取决于工作负载与存储。解释图表之前,应先读取实际配置,而不是默认每台机器都采用相同策略。
zram 提供压缩内存块设备,可以配置为交换;zswap 则在交换页与后备交换设备之间提供压缩缓存。压缩本身消耗 RAM 和 CPU,效果也依赖数据内容。两者都没有通用的延迟、压缩比或安全超配比例。zswap 不是可以直接挂到 /tmp 的文件系统;tmpfs 挂载具有自己的存储语义和容量约束,不能把名称相近的内存机制当成同一项功能。
坏掉的样子
反复回收马上又要使用的页面,会造成严重停顿。原因可能涉及存储延迟与吞吐,也可能涉及回收工作、压缩开销、控制组限制和竞争 I/O。颠簸并不保证最终触发 OOM 杀进程,固定的交换速率也不是普遍适用的诊断线。应把内存压力与有效吞吐、响应时间放在同一个观察窗口比较,再决定主要瓶颈在哪里。
交换已用量很大,可能只是早先事件留下的冷页面,不证明当前正在发生故障。相反,交换流量很小也不证明内存足够:交换可能未启用,工作负载可能碰到控制组上限,或者回收主要发生在文件页。主缺页计数上升也包括文件支撑的缺页,不能直接重新命名成换入次数。把相关指标当成同一个计数器,会让排查走向相反结论。
计划中的交换文件可能因为布局或文件系统限制而无法启用。带空洞的文件不适用,但复制是否产生空洞,取决于具体工具、选项和源文件,不能一概而论。应检查已经激活的交换清单,不要假定配置文件里写过一行就已经生效。也不要仅为重现一篇诊断文章,就在活动机器上启停交换或调整容量。
快速验证
在安装了 util-linux 和 procps 的 Linux 环境运行这些只读命令。检查只观察当前环境的三个采样间隔,不制造内存压力,也不更改内核设置。机器没有启用交换也是有效观察结果,并不是实验失败;它只是告诉你不能依靠这些交换设备缓解未来的页面回收需求:
set -eu
swapon --show
free -h
vmstat -y 1 3
grep -E '^(pswpin|pswpout|pgmajfault) ' /proc/vmstat
if test -r /proc/pressure/memory; then
cat /proc/pressure/memory
else
printf '%s\n' 'memory PSI is unavailable in this environment'
fi
swapon --show 列出已经启用的交换区域,free 则分别报告内存与交换总量。vmstat -y 省去自开机以来的首份统计,因此输出的三行对应采样间隔。阅读显示单位,把换入换出与阻塞任务、CPU 时间一起比较。随后从 /proc/vmstat 读取的累计计数是另一份快照,不能直接当成前面每行对应的每秒速率。
如果环境提供内存 PSI,它报告因内存压力而停顿的时间。some 和 full 分别表示测量范围内至少部分任务停顿,以及所有非空闲任务同时停顿。短暂安静的样本不能排除之前发生过尖峰。容器可见性与控制组边界也很重要:宿主累计计数并不会自动说明某一个应用还能分配多少内存,分析必须匹配真正受限制的对象。
这项检查验证的是观察路径及解释方法,没有测量存储性能、决定安全交换容量,也没有验证 OOM 恢复。保留时间戳,用代表性的事故窗口对照应用延迟与资源限制。如果证据表明工作集持续挤压内存,应减少需求或提供适当容量。调整回收策略时要有可撤销方案,并衡量实际服务效果,不能把交换使用量永远为零当成独立目标。
来源
- 内核 VM sysctl,相对 I/O 成本与零值行为,已核验 2026-10-15。
- 内核 tmpfs,可换出的 tmpfs 与挂载限制,已核验 2026-10-15。
- 内核 zram,压缩块设备与存储统计,已核验 2026-10-15。
- 内核 zswap,压缩交换缓存及后备设备关系,已核验 2026-10-15。
- 内核 PSI,内存停顿范围与平均值,已核验 2026-10-15。
- vmstat(8),间隔报告与交换速率字段,已核验 2026-10-15。
- proc_vmstat(5),独立的交换与主缺页计数,已核验 2026-10-15。
- swapon(8),活动清单与交换文件约束,已核验 2026-10-15。