/proc/buddyinfo文件

/proc/buddyinfo文件

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

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 工具可以实时监控相关剩余内存的变化

#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
quora上关于这个问题的讨论里面有What is the purpose of “/proc/buddyinfo” entry on Linux systems?
[v4,2/2] mm/page_alloc.c: introduce kernelcore=mirror option
KernelNewbies: Linux_4.6
Mastering Linux Kernel Development: A kernel developer’s reference manual
Physical Memory Model
Memory Fragmentation

Be First to Comment

发表回复