当前位置: 首页 > news >正文

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

相关文章:

  • redis缓存常见问题
  • 12.7 LangChain实战:1.2秒响应!用LCEL构建高效RAG系统,准确率提升41%
  • 力扣 88.合并两个有序数组
  • vscode配置lua
  • PowerShell脚本编程基础指南
  • 《认知觉醒》第二章——驯服你的“脑内大象”:理智、本能与情绪的共生之道
  • 【Harmony OS】数据存储
  • Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互
  • 项目目标和期望未被清晰传达,如何改进?
  • 【计算机网络】第七章 运输层
  • 动态规划-数位DP
  • 【学习笔记】深度学习-过拟合解决方案
  • 基于Halcon深度学习之分类
  • 【bpmn.js 使用总结】最简单实现Palette
  • 在Mathematica中实现Newton-Raphson迭代
  • 从零打造AI面试系统全栈开发
  • 生成JavaDoc文档
  • [Java 基础]运算符,将盒子套起来
  • Qiskit:量子计算模拟器
  • 01-python爬虫-第一个爬虫程序
  • 银川网站建设是什么/html简单网页成品
  • 上海石化有做网站设计的吗/世界最新新闻
  • 做.net网站流程/网站制作工具有哪些
  • 找别人建网站去哪里/百度云登录
  • 定西企业网站制作/全网seo优化电话
  • 做美陈3d模型网站/短信广告投放软件