/proc/buddyinfo是linuxbuddy系统管理物理内存的debug信息。
在linux中使用buddy算法解决物理内存的外碎片问题,其把所有空闲的内存,以2的幂次方的形式,分成11个块链表,分别对应为1、2、4、8、16、32、64、128、256、512、1024个页块。
而Linux支持NUMA技术,对于NUMA设备,NUMA系统的结点通常是由一组CPU和本地内存组成,每一个节点都有相应的本地内存,因此buddyinfo 中的Node0表示节点ID;而每一个节点下的内存设备,又可以划分为多个内存区域(zone),因此下面的显示中,对于Node0的内存,又划分类DMA、Normal、HighMem区域。而后面则是表示空闲的区域。
此处以Normal区域进行分析,第二列值为100,表示当前系统中normal区域,可用的连续两页的内存大小为100*2*PAGE_SIZE;第三列值为52,表示当前系统中normal区域,可用的连续四页的内存大小为52*2^2*PAGE_SIZE
cat /proc/buddyinfo
Node 0, zone DMA 23 15 4 5 2 3 3 2 3 1 0
Node 0, zone Normal 149 100 52 33 23 5 32 8 12 2 59
Node 0, zone HighMem 11 21 23 49 29 15 8 16 12 2 142
------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------
/ # cat /proc/zoneinfo
[ 37.543024] Dean kernel/fork.c 1155 copy_process
[ 37.548415] Dean pid=121 tpid=121 name=sh
Node 0, zone Normal
pages free 56749
min 501
low 626
high 751
scanned 0
spanned 65536
present 62976
nr_free_pages 56749
nr_inactive_anon 0
nr_active_anon 67
nr_inactive_file 1837
nr_active_file 235
nr_unevictable 0
nr_mlock 0
nr_anon_pages 74
nr_mapped 282
nr_file_pages 2072
nr_dirty 0
nr_writeback 0
nr_slab_reclaimable 324
nr_slab_unreclaimable 645
nr_page_table_pages 17
nr_kernel_stack 57
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_vmscan_immediate_reclaim 0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 0
nr_dirtied 0
nr_written 0
nr_anon_transparent_hugepages 0
protection: (0, 0)
pagesets
cpu: 0
count: 50
high: 90
batch: 15
all_unreclaimable: 0
start_pfn: 262144
inactive_ratio: 1
Zone的管理调度的一些参数: (Zone watermarks),
英文直译为zone的水平,打个比喻,就像一个水库,水存量很小的时候加大进水量,水存量达到一个标准的时候,减小进水量,当快要满的时候,可能就关闭了进水口。pages_min, pages_low and pages_high就类似与这个标准。
当系统中可用内存很少的时候,系统代码kswapd被唤醒,开始回收释放page。pages_min, pages_low and pages_high这些参数影响着这个代码的行为。
每个zone有三个水平标准:pages_min, pages_low and pages_high,帮助确定zone中内存分配使用的压力状态。kswapd和这3个参数的互动关系如下图:
page_min中所表示的page的数量值,是在内存初始化的过程中调用free_area_init_core()中计算的。这个数值是根据zone中的page的数量除以一个>1的系数来确定的。通常是这样初始化的ZoneSizeInPages/128。
page_low: 当空闲页面的数量达到page_low所标定的数量的时候,kswapd线程将被唤醒,并开始释放回收页面。这个值默认是page_min的2倍。
page_min: 当空闲页面的数量达到page_min所标定的数量的时候, 分配页面的动作和kswapd线程同步运行
page_high: 当空闲页面的数量达到page_high所标定的数量的时候, kswapd线程将重新休眠,通常这个数值是page_min的3倍。