linux内存碎片化无直接指标,但可通过/proc/buddyinfo中高阶(order≥8)空闲页长期为0、pgalloc_normal_fail持续增长、dmesg中page allocation failure及compaction失败日志、hugepages_free远低于total等现象综合判定。

Linux 系统中内存碎片化本身不直接暴露为一个“指标”,但其影响会体现在内存分配延迟、大页(HugePage)分配失败、kmalloc或__alloc_pages慢路径触发频率升高,以及 /proc/buddyinfo 中高阶空闲页数量持续偏低等现象上。监控重点不是“碎片化值”,而是识别碎片化是否已实际干扰关键工作负载。
看 buddyinfo:判断物理内存页块的连续性分布
/proc/buddyinfo 是最直接反映内存碎片状态的内核接口。它按内存管理区(zone)和页阶数(order 0~10,对应 4KB~4MB 连续页)显示当前空闲页块数量。
- 重点关注 高阶(order ≥ 8,即 1MB+)空闲页数是否长期为 0 或极低,尤其在有大页需求(如数据库、DPDK 应用)的系统上;
- 对比不同 zone(如 Normal vs DMA32):若 Normal zone 高阶页耗尽而 DMA32 仍有富余,说明碎片集中在常用区域;
- 可定时采集并绘图(例如用
awk提取 order9/10 数值),观察趋势——突发性归零常与内存泄漏、频繁 alloc/free 大块内存有关。
查 page-failures:确认碎片是否导致分配失败
内核提供 /sys/kernel/debug/extfrag/extfrag_level(需挂载 debugfs)和更实用的 /proc/sys/vm/extfrag_threshold,但真正反映后果的是分配失败统计:
- 运行
cat /proc/vmstat | grep -E "(pgmajfault|pgpgin|pgpgout|pgalloc_|pgfree|pgskip)",特别关注pgalloc_dma32、pgalloc_normal后缀中pgalloc_<zone>_high</zone>(表示 fallback 到更高阶分配)和pgalloc_<zone>_fail</zone>(分配失败)计数; - 若
pgalloc_normal_fail持续增长,且伴随kswapd频繁唤醒或direct_compaction耗时升高(见/proc/vmstat中pgmajfault和compact_*字段),说明碎片已迫使内核反复尝试压缩或回收; - 使用
perf record -e kmem:kmalloc,kmem:kfree -a sleep 30可辅助分析高频小对象分配模式,间接定位碎片诱因。
观察大页(HugePage)分配稳定性
透明大页(THP)或显式 HugePage 分配对碎片高度敏感:
- 检查
cat /proc/meminfo | grep -i "huge",关注HugePages_Free是否远低于HugePages_Total,且长期无法满足新申请; - 启用 THP 后查看
/sys/kernel/mm/transparent_hugepage/khugepaged/defrag是否为always,再结合/sys/kernel/mm/transparent_hugepage/defrag的状态输出(如defer+madvise表示因碎片推迟合并); - 日志中搜索
dmesg | grep -i "khugepaged.*failed\|compaction.*failed",失败记录直接指向碎片瓶颈。
辅助手段:内存水位与 compaction 活动
碎片问题常与内存压力叠加,需交叉验证:
- 运行
cat /proc/zoneinfo | grep -A5 "node.*Normal" | grep -E "(watermark|compact",观察各 zone 的 low/watermark 值及compact_blocks_{scanned,completed}计数; - 若
compact_blocks_scanned高但compact_blocks_completed低,说明内存压缩(compaction)效率差——典型碎片特征; - 配合
vmstat 1观察si/so(swap in/out)和cs(context switch)是否异常升高,碎片引发的频繁重试可能加剧调度开销。











