什么是 si/so
vmstat 的 si 与 so 分别是每秒换入与换出的内存量(单位 KiB),sar -W 提供同口径的 pswpin/s 与 pswpout/s。少量换出属于正常机制:内核会把长期不用的页挪到 swap 腾出内存。但如果 si/so 持续非零、并伴随响应时间明显上升,就说明内存缺口真实存在,此时调 swappiness 只能改变换页倾向,并不能替代扩容或减少内存占用。
基本信息
| 视图 | vmstat 的 si/so,sar -W 的 pswpin/s、pswpout/s |
|---|---|
| 关联指标 | pgmajfault、/proc/pressure/memory 的 some/full |
| 相关参数 | vm.swappiness、swap 设备大小与优先级 |
| 单位 | vmstat 输出为 KiB/s |
| 前提 | 系统配置了 swap;无 swap 时这些数字自然为 0 |
| 判读 | 持续非零 + 延迟升高 = 内存不足 |
典型使用场景
- 服务响应变慢排查:确认是否有持续的换页行为
- 内存容量评估:用换页速率判断缺口大小
- 确认 swappiness 调整是否见效,而不是凭感觉
- 容器与宿主的责任划分:判断压力来自哪一层
- 故障复盘:把换页高峰与业务延迟曲线对齐
采样与判读
采样与判读
vmstat 1 5 # 关注 si/so 两列
sar -W 1 3 # pswpin/s 与 pswpout/s
cat /proc/pressure/memory # some/full 累积压力
vmstat -s | grep -i -E 'swap|page' # 累计换页与换入换出总量
grep -E 'pswpin|pswpout' /proc/vmstat # 原始计数
free -h # 结合可用内存一起判断现象与结论
| 现象 | 含义 | 处置方向 |
|---|---|---|
| si/so 偶发非零 | 正常的内存回收 | 记录基线,不必干预 |
| so 持续偏高 | 内存不足,频繁换出 | 减少占用或扩容 |
| si/so 同时高 | 换页抖动 | 优先扩容,调参仅缓解 |
| pgmajfault 上升 | 缺页需要读盘 | 结合延迟与 IO 指标评估 |
无 swap 的系统里 si/so 恒为 0,不能据此判断内存充足;应改用 PSI 与可回收内存量作为观察口径。
把 swappiness 调到 0 不能消除内存不足:它只是让内核更不愿意换出,缺口依然存在,最终可能以 OOM 的形式爆发。
没有 swap 或 swap 很小时,观察口径应转向 PSI 的 memory some/full 与 pgmajfault:它们反映内存压力本身,不依赖换页行为,因此在禁用 swap 的机器上同样有效。
换页速率平稳而业务延迟升高时,问题通常不在内存上:应把 P99 曲线与磁盘 IO、CPU 抢占的时间点对齐,避免在错误的方向上扩大内存。