判断swap是否频繁最可靠方式是观察vmstat输出中si和so两列数值与波动模式:连续≥3次so>100KB/s或si>0即成趋势,si与so同时升高表明LRU失效、内存管理失控。

物理内存不足时,内核会把暂时不用的内存页写入 Swap(淘汰到磁盘),这个过程叫“换出”(swap out);当程序再次访问这些页时,又得从磁盘读回(换入,swap in)。vmstat 能直接反映这个淘汰速率,关键看 so 字段——它表示每秒从内存换出到磁盘的千字节数(KB/s)。
盯住 so 和 si 两个字段
执行 vmstat 1 或 vmstat 2 5,观察输出中 swap 区域的 si(swap in)和 so(swap out)列:
- so > 0 持续存在(比如连续几秒都 ≥500 KB/s),说明系统正在主动淘汰内存页,是物理内存紧张的明确信号
- si 也同步上升,意味着被淘汰的页又被频繁访问,导致反复换入换出,性能急剧下降
- 如果 so 长期为 0,即使 free 很低、available 偏紧,也不代表正在淘汰——可能只是缓存占用了空间,还没触发回收压力
结合其他字段交叉验证
单看 so 容易误判,需搭配 memory 和 procs 区域判断是否真缺物理内存:
- free 值持续走低 + buff/cache 不明显回落:说明缓存没被有效回收,内存压力已传导至换页
- swpd 列数值增大:Swap 使用量上升,印证 so 活跃不是瞬时抖动
- r 值偏高(如 > CPU 核数)且 b 值上升:进程因等内存或 I/O 被阻塞,进一步佐证内存瓶颈
避免常见误读
注意几个典型误区:
- 不看第一行:vmstat 首行是启动以来平均值,无实时参考价值,只看后续采样行
- 不依赖 free 字段:free 低 ≠ 内存不足,Linux 会用空闲内存做 cache;真正要看的是 available 是否持续低于应用需求
-
单位别搞错:so 默认单位是 KB/s;加
-S m可改用 MB 显示(vmstat -S m 1),更直观
快速定位淘汰源头
确认 so 持续升高后,下一步不是立刻加内存,而是找出谁在吃内存:
- 用
top或ps aux --sort=-%mem | head -10查内存占用最高的进程 - 用
smem -s rss看实际物理内存(RSS)使用分布,区分真实占用与共享内存 - 检查是否有进程异常增长(如 Java 堆未设上限、Redis 缓存无淘汰策略、日志文件无限追加)


















