swap拐点是swap in/out速率突变点,需结合available下降、so≥10 mb/s、pgmajfault激增等多指标交叉验证,而非仅看swap used是否为0。

压测期间实时捕捉 Swap 吞吐拐点,关键不是单纯看 free 是否“用了 Swap”,而是观察 Swap 活动的**起始、加速、饱和、回落**四个阶段。仅靠 free -s 的静态数值刷新不够——它不显示 Swap 的 I/O 速率变化,而拐点本质是 Swap in/out 速率突变点。需配合其他指标交叉验证。
明确 swap 拐点的真实含义
Swap 拐点 ≠ Swap used > 0。真正值得关注的是:
- Swap out 速率首次持续超过 10 MB/s(表明物理内存开始严重不足,内核主动换出)
- Swap in 速率突然飙升(说明被换出的页被频繁访问,出现颠簸 Thrashing 前兆)
- Swap used 增长斜率由缓变陡,且伴随 available 内存跌破 5% 总量
- free 输出中 cached 列不再显著下降,但 used 持续上升(说明缓存已压到极限,开始动真格换出)
用 free -s 配合其他命令构建拐点信号链
free -h -s 2 只能提供快照,必须串联以下三类输出才能定位拐点:
-
内存压力信号:运行
free -h -s 2 | grep -E "^(Mem|Swap)",重点关注available和Swap used的变化趋势;当available在 10 秒内下降超 30%,且Swap used开始非线性增长,即触发一级告警 -
Swap I/O 实时速率:同步执行
vmstat 2 1 | tail -1 | awk '{print $9,$10}'(si/so 列,单位 KB/s),若 so 连续 3 次 ≥ 10240(即 ≥10 MB/s),标记为 Swap 出口拐点 -
内核回收行为:检查
cat /proc/vmstat | grep -E "pgpgin|pgpgout|pgmajfault",压测中 pgmajfault(缺页中断)每秒增幅超 500,往往紧随 Swap in 拐点之后出现
一个可落地的压测监控脚本逻辑
不依赖复杂工具,用 shell 实现轻量级拐点捕获:
- 每 2 秒采集一次
free -h和vmstat 1 1输出,写入临时文件 - 对
Swap used值做滑动窗口(5 个点)一阶差分,当差分值连续 2 次翻倍,判定为拐点初现 - 同时匹配
vmstat的so值是否同步突破阈值(如 8 MB/s),双条件满足才记录拐点时间戳 - 拐点发生后自动截取前后 30 秒的
pidstat -r 1输出,定位哪个进程在大量触发缺页
注意规避常见误判
以下情况容易被误认为拐点,实际无风险:
-
Swap used从 0B → 4MB,但available仍 > 3GiB:这是内核预分配策略,非真实压力 -
cached下降明显,used上升,但available稳定:说明只是缓存回收,未触及 Swap -
Swap used缓慢爬升,so始终 - 使用 NVMe SSD 作 Swap 时,
so达 50 MB/s 也不代表拐点——需结合延迟指标(如iostat -x 2中 await











