交换为内存增加一层虽慢的兜底
swap 不是额外的内存。它是一次下注:内核挑出它预测近期用不到的页面,写进设备,把物理内存腾出来。赌对了,一次内存尖峰过去而进程没被杀掉;赌错了,每一次猜错都要付一次设备往返的代价,而这比读一次内存高出三到五个数量级。 这笔交易只在「当阀门」时才成立。用 swap 去覆盖一个长期配置不足的工作负载,买到的不是容量,而是一台慢得看起来像 CPU 问题的机器。所以第一个问题永远是:工作集里到底有多少是真的装不下。 回收是按预测挑受害者的 匿名页——堆、栈、以及 malloc 交出去的每一块——背后没有文件,因此它们是 swap 唯一能装的东西。文件页根本不需要 swap:内核可以把干净的 page cache 直接丢掉,以后再从磁盘读回来。vm.swappiness 的文档定义是「换出与文件系统换页之间粗略的相对 IO 成本」,取值 0 到 200,默认 60。取 0 时,内核要等到空闲页加文件页低于 zone 的高水位线才开始换出,所以 0 的含义是「万不得已才用 swap」,而不是「不用 swap」。 在内部,这个旋钮变成扫描权重:匿名链表用 swappiness,文件链表用 200 - swappiness,再结合两个链表各自的大小。超过 100 并不是配错了:文档明确说,当交换设备上的随机 IO 大约是文件系统 IO 的两倍快时,可以取 133;对于 zram 或 zswap 这类「设备其实就是内存」的内存内交换,也建议考虑超过 100 的取值。 ...