判断Swap是否导致性能下降,关键看vmstat中si/so是否持续>100KB/s、iostat中swap设备await>50ms且%util接近100%、free中available是否远低于内存总量。

直接看 vmstat 输出里的 si(swap-in)和 so(swap-out)两列,就能判断系统是否在频繁换页。数值持续大于 0,尤其单次超过 100 KB/s,就说明内存压力明显;如果 so 长时间不为 0,基本可以确认物理内存已不足,内核正在把匿名页(如进程堆、栈)往 swap 写。
关注 si/so 的真实含义和触发条件
si 表示每秒从 swap 读回物理内存的千字节数,对应“页面换入”;so 表示每秒写入 swap 的千字节数,对应“页面换出”。注意:文件页(如代码段、缓存的文件数据)一般不走 swap,而是直接丢弃或回写磁盘,所以 so 持续上升,大概率是大量匿名页被回收——这是 Java、Python 等动态语言服务或大内存进程的典型表现。
常见误判点:
- 物理内存还有空闲(free 显示剩余几 GB),但 so 却不为 0:这很正常。Linux 内核会提前换出不活跃页,避免临界时手忙脚乱。
- si 偶尔跳一下(比如 20~50):可能是某个进程刚访问了之前被换出的内存,属于正常缺页行为;但若 si 和 so 同时稳定在高位(如都 > 200),就是典型的 thrashing(颠簸)前兆。
结合 wa 和 bi/bo 看 IO 是否被拖累
换页不是纯内存操作,它依赖磁盘 IO。所以要同步观察:
- wa(IO 等待 CPU 百分比):若长期 > 20%,说明 swap IO 已经开始抢夺 CPU 时间;
- bi(块设备读 KB/s)和 bo(块设备写 KB/s):如果 bo 和 so 趋势高度一致,基本能锁定 swap 是主要写负载;若 bo 远高于 so,说明脏页回写(如数据库日志刷盘)也在并发进行,问题更复杂。
定位到底是哪个进程在触发换页
vmstat 本身不显示进程名,但它能帮你缩小范围:
- 先用 vmstat 1 确认换页是否持续发生;
- 接着运行 pidstat -r 1,重点关注 MBswpin 和 MBswpout 列,直接看到每个进程每秒换入换出多少 MB;
- 或用 top 按 Shift + O 切换排序,输入 SWAP,按 swap 使用量降序排列;
- 对可疑进程,再查 cat /proc/PID/status | grep -E "VmSwap|MMUPageSize",确认其 swap 占用和是否用了大页(大页不会被 swap)。
别只盯着数字,先看内存水位和 swappiness
换页是否合理,要看内核的回收策略是否被误配:
- 查当前值:cat /proc/sys/vm/swappiness,默认是 60;值越高,越倾向换出匿名页;值设为 0 并不意味完全禁用 swap(仅在内存真正耗尽时才用),而设为 100 则近乎激进换页;
- 查内存水位:cat /proc/zoneinfo | grep -A5 "pages low",若 pages_low 频繁被击穿,kswapd 就会持续唤醒并换页;
- 观察 free -h 中的 available 字段,它才是系统真正可用的内存估算值,比 free 更可靠。


















