抖动是内存严重不足时系统频繁换页导致性能骤降的现象,表现为si/so持续非零、free极低、wa飙升,根源在于物理内存无法满足进程工作集需求。

页面换页抖动(page thrashing)是内存严重不足时的典型症状:内核在物理内存和 Swap 之间高频换入(si)换出(so),导致 I/O 暴涨、响应迟缓、CPU wa(I/O wait)飙升。它不是单纯“内存用得多”,而是内存管理机制已失衡——系统忙于搬运页,却无法稳定服务进程。排查需紧扣“换页是否真实发生”和“谁在驱动换页”两个核心。
看 vmstat 确认换页是否活跃
运行 vmstat 1 5,重点关注以下三列:
- si(swap in)和 so(swap out):单位 KB/s。只要其中任一列持续 > 0(尤其 > 1000 KB/s),就表明系统正在主动换页;若连续多秒非零,基本可判定为抖动。
- free:持续低于几百 MB,说明物理内存几近耗尽,换页已成常态。
- wa(I/O wait):若 > 20% 且与 si/so 高峰同步,说明磁盘 I/O 正被换页请求拖垮。
查 swap 使用趋势与触发原因
换页抖动往往伴随 Swap 被实质性使用:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 运行 swapon -s 或 cat /proc/swaps,确认 swap 分区已启用且有实际使用(不是 0)。
- 检查 cat /proc/meminfo | grep -E "^(SwapTotal|SwapFree|Committed_AS|CommitLimit)":
– 若 SwapFree 接近 0,说明 swap 已快写满;
– 若 Committed_AS > CommitLimit,表示系统已过度承诺内存,OOM 风险极高;
– 若 OomKillCount 非零,说明 OOM Killer 已介入,换页已是前兆。
定位驱动换页的进程或内核对象
换页不是凭空发生的,一定有内存消费者在持续申请或长期驻留:
- 用 top 或 htop 按 M 键排序,重点看 RSS 和 %MEM,同时留意状态为 D(不可中断睡眠)的进程——它可能因等待 I/O 卡住并锁住大量内存。
- 对 RSS 异常高的进程,执行 pmap -x PID,观察是否大量 anon(匿名映射,如堆/栈)或 mmapped 区域;再查 cat /proc/PID/smaps | grep -E "^Size|^Rss|^MMUPageSize",确认是否用了大页或存在未释放的 mmap 区域。
- 若用户进程 RSS 总和远小于 total used,转向内核侧:
– 运行 slabtop,关注 SUnreclaim 高的 cache(如 kmalloc-*、ext4_inode_cache);
– 执行 cat /proc/meminfo | grep -E "^(SUnreclaim|PageTables|KernelStack)",SUnreclaim 持续增长或 PageTables > 几百 MB,常指向内核内存泄漏或进程数爆炸。
验证是否由 swappiness 设置不当引发
过高的 swappiness(默认 60)会让内核过早换出匿名页,即使 available 仍有余量:
- 查当前值:cat /proc/sys/vm/swappiness。
- 若值 ≥ 80 且系统无真实压力(available 充足、si/so 为 0),则换页抖动很可能是策略激进所致;临时调低:sysctl vm.swappiness=10,观察是否缓解。
- 注意:若调低后仍持续换页,说明问题不在策略,而在真实内存短缺,需回溯前几步深入定位。










