linux内存管理信息buddyinfo和slabinfo和zoneinfo

 /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 

------------------------------------------------------------------------------------------------------------------------------------

文件/proc/slabinfo统计slab分配器相关信息

% cat /proc/slabinfo

slabinfo - version: 1.1
kmem_cache            65       70      108    2      2    1
ip_fib_hash              10      112       32     1      1    1
urb_priv                    0          0       64     0      0    1
journal_head             19    9009       48     2   117    1
.....
size-1024(DMA)         0         0     1024    0      0    1
size-1024                  42       48     1024   11   12    1
size-512(DMA)           0         0       512    0      0    1
size-512                    28       72       512    4      9    1
 
每一项意义如下:
 
名称     active对象     总对象     对象大小     有active对象的页数     总页数     slab占用页数

-------------------------------------------------------------------------------------------------------------------------------------------------

/ # 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个参数的互动关系如下图:

linux内存管理信息buddyinfo和slabinfo和zoneinfo_第1张图片

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倍。


你可能感兴趣的:(linux内存管理信息buddyinfo和slabinfo和zoneinfo)