交换占用用保存的冷页表示,间隔流量用双向页面箭头表示,内存压力用任务停顿标记表示;三种观察回答不同问题。

Swap 用回收成本换取驻留空间

Swap 为 Linux 中适合换出的页面提供后备存储,让暂时不需要驻留的数据离开物理内存,把 RAM 留给活跃工作。但它不会让超出容量的工作集继续拥有内存访问速度。真正要问的是:回收是否腾出了空间,同时没有反复阻塞重要任务。交换占用、交换流量与应用进展,分别回答这个问题的一部分,不能拿其中一个数字概括全部情况。 分清哪些页面可以移动 匿名内存经常使用交换,但并非唯一情况。配置允许时,tmpfs 和共享内存页面也能换出。普通文件支撑的干净页面通常可以丢弃,以后从原文件重读;脏文件页则需要适当写回。并非所有分配都可以回收,被锁定而禁止换页的内存还有另外约束。因此,“所有 malloc 分配的东西”不足以描述内核实际上能够移走哪些内容。 vm.swappiness 在零到二百的文档范围内,表达交换与文件系统换页之间的相对成本;它不是达到某个 RAM 使用百分比后才开启交换的阈值。设为零也不等于在所有情形下禁用交换。如果压缩交换或更快的交换设备比文件系统换页便宜,大于一百的值可能合理,但适当取值取决于工作负载与存储。解释图表之前,应先读取实际配置,而不是默认每台机器都采用相同策略。 zram 提供压缩内存块设备,可以配置为交换;zswap 则在交换页与后备交换设备之间提供压缩缓存。压缩本身消耗 RAM 和 CPU,效果也依赖数据内容。两者都没有通用的延迟、压缩比或安全超配比例。zswap 不是可以直接挂到 /tmp 的文件系统;tmpfs 挂载具有自己的存储语义和容量约束,不能把名称相近的内存机制当成同一项功能。 坏掉的样子 反复回收马上又要使用的页面,会造成严重停顿。原因可能涉及存储延迟与吞吐,也可能涉及回收工作、压缩开销、控制组限制和竞争 I/O。颠簸并不保证最终触发 OOM 杀进程,固定的交换速率也不是普遍适用的诊断线。应把内存压力与有效吞吐、响应时间放在同一个观察窗口比较,再决定主要瓶颈在哪里。 交换已用量很大,可能只是早先事件留下的冷页面,不证明当前正在发生故障。相反,交换流量很小也不证明内存足够:交换可能未启用,工作负载可能碰到控制组上限,或者回收主要发生在文件页。主缺页计数上升也包括文件支撑的缺页,不能直接重新命名成换入次数。把相关指标当成同一个计数器,会让排查走向相反结论。 计划中的交换文件可能因为布局或文件系统限制而无法启用。带空洞的文件不适用,但复制是否产生空洞,取决于具体工具、选项和源文件,不能一概而论。应检查已经激活的交换清单,不要假定配置文件里写过一行就已经生效。也不要仅为重现一篇诊断文章,就在活动机器上启停交换或调整容量。 仅凭交换占用不能判断当前压力;间隔流量与 PSI 分别量化活动与停顿的不同方面。 快速验证 在安装了 util-linux 和 procps 的 Linux 环境运行这些只读命令。检查只观察当前环境的三个采样间隔,不制造内存压力,也不更改内核设置。机器没有启用交换也是有效观察结果,并不是实验失败;它只是告诉你不能依靠这些交换设备缓解未来的页面回收需求: ...

十一月 25, 2026 · 1 分钟 · XB Field Notes