sar -R 仅监控分页活动,不能反映内存碎片化;真实碎片状态需通过 /proc/buddyinfo 查看各阶空闲页分布,高阶为0而低阶充足表明外部碎片;sar -r 显示宏观内存水位,不体现页连续性;验证碎片影响需结合 dmesg 日志、/proc/vmstat 及 sysrq-trigger 触发的 buddy info 快照。

sar -R 不能监控内存碎片化程度,也不能直接显示“物理内存页的可用量”——它只报告内存分页(paging)活动,比如换入换出页面的速率,和页面回收行为无关。
真正能反映内存页可用性与碎片状态的指标在 /proc/buddyinfo
Linux 内核通过 buddy system 管理物理内存页,内存碎片化程度体现在不同阶(order)空闲页块的数量上。查看命令:
-
cat /proc/buddyinfo—— 显示每个内存区域(zone)中各阶(order 0~10)空闲页块个数 - order 0 表示单个 4KB 页;order 1 表示连续 2 个页(8KB);order 2 是 4 个页(16KB),以此类推
- 若高阶(如 order 5+)空闲页数量为 0,但低阶(order 0~2)仍有大量页,则说明存在外部碎片:空闲页总数不少,但无法满足大块连续内存申请
sar -r 是看内存使用总量,不是页级碎片
sar -r 输出的是宏观内存水位,例如:
-
kbmemfree:当前空闲物理内存(KB),含可回收缓存前的“硬空闲” -
%memused:已用物理内存百分比 -
kbactive/kbinact:活跃/非活跃内存页估算值(用于LRU淘汰) - 它不区分页是否连续,也不体现 buddy 系统中各阶空闲块分布
辅助判断碎片影响的实际方法
仅看数据不够,需结合系统行为验证碎片是否造成问题:
- 观察内核日志:
dmesg | grep -i "page allocation failure\|order",出现失败即表明高阶分配受阻 - 检查直接内存回收频率:
grep "pgmajfault\|pgpgin" /proc/vmstat,频繁 majfault 可能与碎片导致的迁移/重映射有关 - 运行
echo m > /proc/sysrq-trigger后查dmesg,可临时触发内存整理并输出当前各 zone 的 buddy info 快照
内存碎片整理是内核自动触发的,不可用 sar 控制或观测其过程
Linux 自 2.6.32 起支持 memory compaction,当分配失败或 kswapd 压力大时自动运行。它不产生 sar 日志,也不暴露为 sar -R 或 -r 的字段。唯一可观测入口仍是 /proc/buddyinfo 和 /proc/vmstat 中的 compact_* 计数器(如 compact_successes、compact_stall)。











