需通过cat /proc/buddyinfo查看各内存区域高阶空闲页数判断碎片程度,重点观察阶数7及以上(≥2MB)是否持续为0,并结合最大连续阶数换算实际字节数,同时分zone(如DMA32)单独分析以定位瓶颈。

要在统信UOS终端中查看当前系统的内存碎片情况,需直接读取内核提供的内存页分配状态信息,因为系统没有提供“内存碎片”这一独立指标的快捷命令,而是通过分析/proc/buddyinfo中各阶空闲页块数量分布来判断碎片化程度——阶数越高代表连续大块空闲内存越少,碎片风险越大。
查看buddyinfo判断内存碎片程度
这一步是核心依据,/proc/buddyinfo记录了每个内存区域(zone)中按2n页大小划分的空闲块数量,是Linux内核评估内存碎片最底层、最权威的数据源。
1、打开终端(Ctrl + Alt + T)→ 输入命令:cat /proc/buddyinfo → 按回车执行。
2、观察输出中每一行的“Node X, zone Y”字段后跟随的数字序列,例如:Node 0, zone DMA 12 8 5 3 1 0 0 0 0 0 0。其中第1个数字是阶数0(1页)、第2个是阶数1(2页)、第3个是阶数2(4页)……直到阶数10(1024页,即4MB连续块)。
3、重点看高阶(如阶数7及以上,对应512页/2MB以上)数值是否持续为0:若多个zone在阶数8、9、10处均为0,说明系统已无法满足大块连续内存分配请求,存在严重外部碎片。
4、注意:该文件无需sudo权限即可读取,但仅反映当前快照;内存碎片是动态变化的,需结合业务负载周期性观察。
辅助验证:检查可分配的最大连续页块
此方法给出一个直观数值,告诉你当前能一次性分配的最大连续物理页数是多少,比单纯看buddyinfo更易理解碎片的实际影响。
方法一:使用grep快速提取最大阶非零值
在终端中运行:awk '/Node/ {for(i=4;i0) max=i-3} END{print "最大可用连续阶数:", max, "(对应", 2^max, "页)"}' /proc/buddyinfo
方法二:人工对照阶数与字节数换算表(每页默认4KB)
阶数0 = 4KB,阶数1 = 8KB,阶数2 = 16KB……阶数9 = 2MB,阶数10 = 4MB。若输出显示最大阶数为6,则最大连续块为64KB;若为4,则仅64页即256KB——这意味着任何需要1MB以上连续内存的驱动或应用可能失败。
排查是否由特定内存类型导致碎片
某些zone(如DMA、DMA32)因硬件限制只能用于特定设备,长期分配释放后更容易堆积碎片,不能只看整体Mem区。
第一步:定位关键zone
执行:grep -E "Node|DMA|Normal|HighMem" /proc/buddyinfo,分离出DMA、DMA32、Normal等zone的各行数据。
第二步:单独分析DMA32区(x86_64常见瓶颈区)
运行:awk '/DMA32/ {for(i=4;i,查看其高阶数值衰减趋势。
【DMA32区阶数8以上全为0是常见碎片信号,尤其在运行GPU驱动或视频编解码进程后】
第三步:确认当前活跃分配压力源
配合执行:cat /proc/sys/vm/extfrag_threshold,该值默认为500,表示当外部碎片指数超过该阈值时内核会更激进地进行内存压缩;若该值被调低(如设为100),说明系统已主动应对碎片问题。

















