不能单独依据 /sys/kernel/mm/vmscan/ 判断 swap 压力,因其仅提供内存回收策略参数与统计计数器,不反映实时 swap I/O;真正核心指标是 vmstat 的 si 和 so,辅以 /proc/vmstat 中 pgpgout、nr_inactive_anon 等数据联动分析。

直接看 /sys/kernel/mm/vmscan/ 下的文件,不能单独判定 swap 压力。这个目录里没有实时反映 swap 搬运强度的指标,它只暴露内核内存回收(reclaim)的策略性参数和统计计数器,比如扫描了多少页、是否触发了直接回收、是否跳过某些区域等。它不记录页面是被换出到 swap 还是被释放为干净页,也不区分 anon page 和 file-backed page 的处理路径。
真正体现 swap 压力的核心信号,始终在 vmstat 的 si(swap-in)和 so(swap-out)列 —— 它们是唯一能告诉你“此刻内核是否在狂搬匿名页”的实时 I/O 速率指标。
不过,/sys/kernel/mm/vmscan/ 中的部分值可以作为辅助佐证,帮助你判断内核是否正因内存紧张而频繁启动回收,并倾向于把匿名页换出:
pgpgin/pgpgout(在/proc/vmstat中,非 vmscan 目录)
这两个才是底层计数器:pgpgout表示每秒换出到块设备的扇区数(512 字节/扇区),pgpgin是换入扇区数。so和si就是从它们派生出来的 KB/s 值。vmscan 目录里没有它们。-
nr_scanned、nr_reclaimed、nr_direct_reclaim(位于/sys/kernel/mm/vmscan/)-
nr_direct_reclaim持续增长,说明应用线程正在阻塞等待内存,内核被迫同步回收 → 是内存压力的强信号; -
nr_scanned远大于nr_reclaimed(例如比值 > 3),说明扫描了很多页但回收效率低 → 可能因为大量页被标记为“不可回收”或“需写回”,其中匿名页若无法立即写入 swap,就会卡住回收流程; - 若
nr_reclaimed中 anon 类页占比高(需结合/proc/vmstat中pgmajfault、pgpgout趋势交叉看),才暗示 swap 路径被高频使用。
-
swappiness设置是否生效/sys/kernel/mm/vmscan/swappiness显示当前值。如果它 ≥ 60,且so同步升高,说明内核更激进地换出匿名页;若设为 1–10 但so仍持续 > 100 KB/s,则基本确认物理内存已实质性不足,抑制策略失效。lru_*_active/lru_*_inactive页面数量(需读/proc/vmstat)nr_inactive_anon接近SwapTotal(用swapon --show查),表示大量匿名页已被移入 inactive lru 链表,随时可能被kswapd或 direct reclaim 换出 → 是so即将升高的前置指标。
所以操作上应这样联动判断:
- 先跑
vmstat 1 10,盯si和so是否连续 ≥3 次非零(尤其so > 100); - 若成立,立刻查:
-
cat /proc/vmstat | grep -E "pgpgout|pgmajfault|nr_inactive_anon"看底层计数是否同步飙升; -
cat /sys/kernel/mm/vmscan/nr_direct_reclaim是否在采样期间明显跳变; -
free -h看MemAvailable是否 < 总内存 10%; -
cat /proc/sys/vm/swappiness确认当前策略倾向。
-
vmscan 目录本身不是仪表盘,它是“手术室后台日志”,得配合 vmstat 和 vmstat 的源头数据一起读,才能还原出 swap 压力的真实图景。

















