什么是 /proc/buddyinfo
/proc/buddyinfo
是 Linux 内核提供的一个虚拟文件,可用于诊断内存碎片
一、伙伴算法(buddy allocator)简介
-
Linux 内核为了管理物理内存,把内存分成一页一页(通常4KB)。
-
伙伴算法维护空闲页块的不同大小的“块”。
-
块大小是 2 的幂,比如:
-
order 0:1 页(4KB)
-
order 1:2 页(8KB)
-
order 2:4 页(16KB)
-
order 3:8 页(32KB)
-
依此类推...
-
-
这些块被组织成“伙伴”,方便分配和释放,合并相邻块,减少碎片。
二、/proc/buddyinfo
文件内容格式
内容示例:
Node 0, zone DMA 5 3 2 1 0 0 0 0 0 0 0
Node 0, zone DMA32 10000 5000 2000 1000 500 250 125 60 30 15 7
Node 0, zone Normal 20000 15000 10000 5000 2500 1250 625 300 150 75 35
-
每行对应一个 NUMA节点(Node) 的 内存区域(zone)。
-
Node 0:表示第0个NUMA节点(大部分普通服务器只有一个NUMA节点)
-
zone DMA、DMA32、Normal 是不同用途的内存区段。
-
-
后面数字从左到右依次代表不同阶(order)的空闲块数量。
三、zone 区域介绍
-
DMA:用于某些设备DMA访问的低地址内存,通常很小。
-
DMA32:支持32位DMA的内存区域,64位系统有时需要。
-
Normal:普通内存,绝大部分进程使用的内存来自这里。
四、order(阶)的含义
-
order 0 是最小单位,一页(4KB)
-
order 1 是两页(8KB)
-
order 2 是四页(16KB)
-
order 3 是八页(32KB)
-
以此类推,order n = 2^n 页大小
五、怎么看 /proc/buddyinfo
-
关注 order 0 的数量
-
order 0 数量代表最小的内存块数量,最常用来分配。
-
如果 order 0 数量非常少,可能导致“内存分配失败”。
-
-
关注高阶 order 数量
-
大的块数量少是正常的,因为大块难分配。
-
如果所有阶都很少,说明内存非常紧张。
-
-
结合
free
、vmstat
观察系统整体内存状态
六、实际场景分析举例
假设输出:
Node 0, zone Normal 1000 10 5 1 0 0 0 0 0 0 0
-
1000 个 order0 空闲块比较正常
-
10 个 order1,5 个 order2,说明有一些中等大小块
-
0 个大块,可能是内存碎片化严重
如果:
Node 0, zone Normal 0 0 0 0 0 0 0 0 0 0 0
表示内存极度紧张,或者碎片严重,内存分配会失败。
七、内存分配失败与 buddyinfo 的关系
-
当内核申请内存时,如果需要连续的物理页,会根据 order 找合适大小的空闲块。
-
如果合适的 order 没有空闲块,申请失败。
-
GFP_ATOMIC 分配不能睡眠,不能等待内存回收,所以更容易失败。
八、如何减少内存碎片
-
保持系统负载合理,不要长时间内存高压。
-
定期重启内存占用大或有内存泄漏的服务。
-
调整内核参数如
vm.min_free_kbytes
。 -
尽量避免大量高阶内存分配。
-
升级内核版本,内核会改进内存分配算法。
九、常用命令配合 /proc/buddyinfo
观察系统内存状态
free -m # 查看内存使用
vmstat 1 5 # 观察内存、CPU负载趋势
cat /proc/buddyinfo # 查看内存空闲块情况
slabtop # 查看内核缓存使用情况
dmesg | grep -i alloc # 查看内存分配失败日志