linux内存抖动根源是内存长期临界导致内核频繁回收页、换入换出及kswapd压力;需紧盯available(低于10%即吃紧)、swap活动、vmstat中si/so非零、r>cpu核数、wa>15%及pgmajfault飙升等指标。

Linux 系统因内存不足引发的抖动,典型表现是响应忽快忽慢、应用超时集中、%si(软中断)飙升、ping延迟跳变,但 top 里可能看不到明显高 CPU 进程。关键不是看“用了多少内存”,而是看内存是否长期处于临界状态,导致内核频繁回收页、换入换出、触发 kswapd 压力——这才是抖动的根源。
盯住 available 和 swap 活动
先用 free -h 快速确认基础水位:
- available 值低于总内存的 10%(比如 64GB 机器低于 6.4GB),说明真正可分配内存已吃紧;
- Swap used > 0 且持续增长,不是“偶尔用一下”,而是系统在反复腾挪内存;
- 别只看
free字段——它低不等于缺内存,available才是真实可用量。
用 vmstat 捕捉抖动周期中的内存行为
执行 vmstat 2 10(每 2 秒采样一次,共 10 次),重点观察以下字段变化:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- free:持续低于几百 MB 或反复归零,说明空闲池枯竭;
-
si / so:只要出现非零值(尤其是
so > 0且波动频繁),就代表内存正在被写入 Swap,这是抖动最直接的信号; -
r(运行队列):若伴随
si/so上升而r也持续 > CPU 核数,说明进程在等内存回收完成,形成排队延迟; -
wa:如果
so高的同时wa也明显升高(>15%),说明磁盘写 Swap 成了瓶颈,加剧抖动。
结合 pgmajfault 判断是否真缺页
抖动常由大量次缺页(pgmajfault)驱动,比如 Java 应用加载大 JAR、数据库首次读取冷数据:
- 运行
vmstat 1,看pgmajfault列(需vmstat -s或搭配/proc/vmstat查); - 若每秒
pgmajfault达上百次,且与so上升同步,说明进程正频繁从 Swap 或磁盘重新载入内存页; - 此时
kswapd0进程 CPU 占用通常也会明显上升(可用top -p $(pgrep kswapd0)验证)。
排除缓存误判,确认是否真缺资源
Linux 会积极使用 buff/cache 加速 I/O,但这不等于内存不足:
- 如果
available充足、si/so为 0、free虽低但buff/cache占比高,大概率是正常缓存行为,不是抖动根因; - 抖动场景下,
buff/cache往往被内核主动回收(表现为pgpgout上升),而不是稳定占用; - 可临时执行
echo 1 > /proc/sys/vm/compact_memory触发内存整理,若抖动缓解,说明是碎片化+低 available 共同导致的回收压力。










