什么是 /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

  1. 关注 order 0 的数量

    • order 0 数量代表最小的内存块数量,最常用来分配。

    • 如果 order 0 数量非常少,可能导致“内存分配失败”。

  2. 关注高阶 order 数量

    • 大的块数量少是正常的,因为大块难分配。

    • 如果所有阶都很少,说明内存非常紧张。

  3. 结合 freevmstat 观察系统整体内存状态


六、实际场景分析举例

假设输出:

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  # 查看内存分配失败日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值