lowmem_reserve学习

Linux把物理内存划分为三个层次管理

  • 存储节点Node:CPU被划分为多个节点,内存被分簇,每个CPU对应一个本地物理内存,即一个CPUnode对应一个内存簇bank,即每个内存簇被认为是一个节点。内存节点主要依据CPU访问代价的不同而划分。
  • 管理区Zone:每个物理内存节点node被划分为多个内存管理区域,用于表示不同范围的内存,内核可以使用不同的 映射方式映射物理内存。通常一个节点分为DMA,Normal,HighMem三个内存分区。
  • 页面Page:内存被细分为页面,页面是最基本的分配单位

kernel分配内存时会涉及到多个zone,分配会尝试从zonelist的第一个zone分配,如果失败就尝试下一个低级的zone,这里的低级仅仅指zone内存的位置。

zone数据结构中的两个字段:

  • watermark:每个zone在系统启动时会计算出3个水位值,分别为WMARK_MIN,WMARK_LOW,WMARK_HIGH水位,这在页面分配器和kswapd页面回收中会用到
  • lowmem_reserve[MAX_NR_ZONES]:zone中预留的内存,为了防止一些代码必须运行在低地址区域,事先保留一些低地址区域的内存。

当系统中空闲内存低于watermark[low],开始启动kswapd进行页面回收,每个zone都有一个kswapd,直到到达high才开始停止回收。如果上层申请内存速度过快,导致空闲内存降至min一下,内核就会direct reclaim,就是直接在应用程序的上下文中进行页面回收,min以下的内存空间是给系统特殊使用的,不会给用户态程序用。

lowmem_reserve_ratio:这个参数作用是各个zone之间预留一些空间,以防止高端zone在没有内存的情况下过度使用低端zone的内存资源。低端的zone有自己特殊的作用,遵循尽量使用高端内存时不使用低端内存的方法,防止高端内存分配不足的时候抢占稀有的地段内存。

内核利用/proc/zoneinfo中的protection数组计算每个zone的预留页数,计算出来也是数组,

lowmem_reserve_ratio官方文档:
在这里插入图片描述
在这里插入图片描述

分配一些低内存给进程是非常危险的,因为这些内存被分配后可以通过Pin系统调用mlock将其锁定在内存中,或者由于交换空间不可用(低内存一般用用于特殊使用)。
Linux页分配器提供了一种防止分配过多低内存的机制。这就意味一定数量的低内存可以被防止锁定在内存中的可能。
lowmem_reserve_ratio的调节决定了内核对低内存的保护程度。
如果你的设备使用highmem或者ISA DMA,并且你的APP使用mlock(),或者你没有swap空间,你或许应该改lowmem_reserve_ratio的值。
lowmem_reserve_ratio是一个数组,通过cat /proc/sys/vm/lowmem_reserve_ratio查看
这些数值不是直接使用,内核计算通过这些数值计算每个zone的protection pages。protection pages通过cat /proc/zoneinfo查看,每个zone都有一个protection pages,是一个数组。

protection用来决定这个zone是否应该被分配或者被回收
在这里插入图片描述
在这个例子里,如果normal zone(index=2)的页面想要用到DMA zone,并且high水位线用来判断,内核就会判断这个zone不应该被用,因为page_free:1355比水位线+protection[2] (4+2204)的值小。如果这个protection值是0,这个zone就可以用做normal page的要求。

zone[i]的protection[j]的计算:

i<j:表示zone[i]为zone[j]要使用zone[i]内存所保护的内存
	zone[i]->protection[j]=(total sums of managed_pages from zone[i+1] to zone[j] on the node)/lowmem_reserve_ratio[i];
i=j
	不需要被保护
i<j
	不会发生的情况

总结:zone[i]的protection[j]含义是给比自己的zone更高的zone预留的大小,只有更高的内存zone[j]想要分配低zone[i]的内存时才会用到相应的protection[j],因此其他情况可以都设0,计算方法是把zone[i+1]到zone[j]的所有管理内存都加起来除以lowmem_reserve_ratio[i],页为单位。

ex:
有两个zone,DMA和Normal,Normal的managed是758331;lowmem_reserve_ratio是256,32,则DMA的protection为(0,23697,23697)

分配时的判断:如果zone[j]要用zone[i]的内存(j>i),如果freepages<watermark+zone[i]->protection[j],则不能分配,会触发kswapd回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值