监控看到交换分区用了八成,可业务延迟和 CPU 都正常,运维群里一半人主张立刻清空交换,另一半说不必管。
这类报错背后常见的原因有几处,逐个排除就行。内核按这个参数决定回收匿名页还是页缓存。另一种情况是默认值偏向换出,长时间运行后交换占用自然升高。
还有一种情况,曾经的内存峰值留下的换出页一直没有被换回。
上来先确认现在是否还在发生换出
vmstat 1 5 | awk '{print $7,$8}'
接着看当前参数值
cat /proc/sys/vm/swappiness
然后按业务类型下调
sysctl -w vm.swappiness=10
等前面都确认过,再观察一段时间的换入换出
sar -W 1 5
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
别只看报错消失,验证要多做一步。换入换出速率接近零,交换占用缓慢下降,业务延迟保持不变。
关掉再打开交换会把换出页全部拉回内存,内存本来就紧张时这一步会直接触发 OOM。这类问题最好一次改到位,反复小改反而容易把原因搅混。