# /proc/buddyinfo文件
Date: 2020-06-06


### /proc/buddyinfo文件

`/proc/buddyinfo` 文件可以查看Linux机器上可用的内存页， 可以查看每个节点，不同区域的每个`order`大小的块的可用数量, 下面是我们虚拟机的信息：

```C
cat /proc/buddyinfo
Node 0, zone      DMA     97     90     51     31     10      9      6      2      0      0      0
Node 0, zone    DMA32    456    876    665    457    192     83     25      5      1      0      0

```

mm/vmstat.c walk\_zones\_in\_node 实现了其proc文件输出

可以看到显示的单一`NUMA`节点`Node 0`在内核使用`pglist_data`结构表示, 每个节点包含多个 区域, 使用`zone`结构标识。 `ZONE`类型如下:

- `ZONE_DMA`
    
    这个区域为一些不能在所有内存地址初始化DMA的设备保留,大小和体系结构有关 , 一些`ISA`需要它
    
- `ZONE_DMA32`
    
    这个区域仅存在与`X86_64`体系中，支持`32`位设备放到到小于`4G`的内存
    
- `ZONE_NORMAL`
    
    可以直接映射的区域， 如果DMA设备支持所有可寻址内存，则可以将所有可寻址内存视为正常区域, DMA操作可以在这些页面上启动
    
- `ZONE_HIGHMEM`
    
    对于`32bit`系统内核空间和用户空间比例是1:3模式下(3G用户空间，1G 内核空间)， 该区域包含的页面只能由内核通过显式映射到其地址空间来访问，内核段以外的所有物理内存页都可以通过映射到该区域
    
- `ZONE_MOVABLE`
    
    从最高内存区域划出一片的内存, 处理内存碎片，`X86-32bit`大于`ZONE_HIGH`的区域， `X86-64bit` 大于`ZONE_DMA32`的区域,启动是根据内核有参数`kernelcore`用于设置不可移动的内存大小。 如果指定了“mirror”选项，则mirror内存用于非移动分配，其余内存用于移动页面。
    
- `ZONE_DEVICE`
    
    与`SPARSEMEM`这种新的物理内存模型有关, 这种模型支持内存热插拔， 这类内存通过`devm_memremap_pages`,映射到内存的这个区域.
    

伙伴分配将每个区域`ZONE`进一步划分为2次幂(order)个页面大小的块, 就是后面的那串数字

`collectl` 工具可以实时监控相关剩余内存的变化

```Bash
#collectl -sB -oT
waiting for 1 second sample...

# MEMORY FRAGMENTATION (4K pages)
#Time   Node   Zone   1Pg  2Pgs  4Pgs  8Pgs 16Pgs 32Pgs   64Pgs  128Pgs  256Pgs  512Pgs 1024Pgs
12:50:41   0    DMA   126    93    71    64    38    13       4       2       0       0       0
12:50:41   0  DMA32   441   349    94    26    14     0       0       0       0       0       0
12:50:42   0    DMA   126    93    71    64    38    13       4       2       0       0       0
12:50:42   0  DMA32   441   349    94    26    14     0       0       0       0       0       0
12:50:43   0    DMA   126    93    71    64    38    13       4       2       0       0       0
12:50:43   0  DMA32   441   349    94    26    14     0       0       0       0       0       0
12:50:44   0    DMA   126    93    71    64    38    13       4       2       0       0       0
12:50:44   0  DMA32   441   349    94    26    14     0       0       0       0       0       0
12:50:45   0    DMA   126    93    71    64    38    13       4       2       0       0       0
12:50:45   0  DMA32   441   349    94    26    14     0       0       0       0       0       0
12:50:46   0    DMA   126    93    71    64    38    13       4       2       0       0       0
12:50:46   0  DMA32   441   349    94    26    14     0       0       0       0       0       0
12:50:47   0    DMA   126    94    71    66    40    13       4       2       0       0       0
12:50:47   0  DMA32   452   354    97    40    19     0       0       0       0       0       0

```

#### 相关资料

一篇介绍`/proc/buddyinfo`博客文章[Making sense of /proc/buddyinfo](http://andorian.blogspot.com/2014/03/making-sense-of-procbuddyinfo.html) quora上关于这个问题的讨论里面有[What is the purpose of "/proc/buddyinfo" entry on Linux systems?](https://www.quora.com/What-is-the-purpose-of-proc-buddyinfo-entry-on-Linux-systems) [\[v4,2/2\] mm/page\_alloc.c: introduce kernelcore=mirror option](https://lore.kernel.org/patchwork/patch/633557/) [KernelNewbies: Linux\_4.6](https://kernelnewbies.org/Linux_4.6) [Mastering Linux Kernel Development: A kernel developer's reference manual](https://books.google.com/books?id=uxhKDwAAQBAJ&pg=PA102&lpg=PA102&dq=CONFIG_ZONE_DEVICE&source=bl&ots=GFWrr6-eUP&sig=ACfU3U0hy-BgellMn7d_I7y89pnzJlLVKw&hl=zh-CN&sa=X&ved=2ahUKEwii4aPWg-rpAhVNGTQIHf7jC_s4ChDoATAFegQIChAB#v=onepage&q&f=false) [Physical Memory Model](https://01.org/linuxgraphics/gfx-docs/drm/vm/memory-model.html) [Memory Fragmentation](http://collectl.sourceforge.net/BuddyInfo.html)

