top 里 kswapd0 常驻 90% 以上,vmstat 的 si so 一直有数字,接口偶发卡顿几百毫秒,free 显示 swap 已经用掉八成,重启也压不下去,看着像内存彻底不够了。日志里能对上时间点,这种反而好排。

物理内存不够时内核会不停把匿名页换出又换回,落在机械盘上代价更高,kswapd 就成了常驻热点,加 swap 只是把抖动窗口拖得更长,并不能解决问题。这一点先确认清楚,后面就不用反复试。

vmstat 1 5
grep VmSwap /proc/*/status | sort -k2 -rn | head
cat /proc/meminfo | grep -E 'SwapTotal|SwapFree|Dirty'
sudo sysctl -w vm.swappiness=10

「swap 抖动」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

处理上按这个顺序:用 vmstat 连续观察 si so 是否持续非零而不是偶发一两次 采样间隔一秒;按进程统计 VmSwap 找出被换出最多的那个服务 它通常是内存大户;评估加内存或者调低 swappiness 以及是否值得直接关 swap 关之前想清楚后果。

结果对不对很好判断,si so 回落到零附近 kswapd0 的 CPU 占用降到个位数 接口不再抖动 隔天再确认一次。

作者 9823189