/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