一、两个概念
1.内存水位:watermark
当系统中空闲内存低于watermark[low],开始启动kswapd进行页面回收,每个zone都有一个kswapd,直到到达high才开始停止回收。如果上层申请内存速度过快,导致空闲内存降至min一下,内核就会direct reclaim,就是直接在应用程序的上下文中进行页面回收,min以下的内存空间是给系统特殊使用的,不会给用户态程序用。
2.内存保留:lowmem_reserve_ratio
这个参数作用是各个zone之间预留一些空间,以防止高端zone在没有内存的情况下过度使用低端zone的内存资源。低端的zone有自己特殊的作用,遵循尽量使用高端内存时不使用低端内存的方法,防止高端内存分配不足的时候抢占稀有的地段内存。
二、具体流程分析
1、查看当前的内存水位配置
[root@jdsh lib]$cat /proc/zoneinfo | grep -E "Node|min|low|high|managed"
Node 0, zone Normal
min 502
low 627
high 753
managed 63279
high: 90
[root@jdsh lib]$cat /proc/sys/vm/min_free_kbytes
2011
2、配置当前的内存水位10M
[root@jdsh lib]$echo 10240 > /proc/sys/vm/min_free_kbytes
[root@jdsh lib]$cat /proc/sys/vm/min_free_kbytes
10240
[root@jdsh lib]$cat /proc/zoneinfo | grep -E "Node|min|low|high|managed"
Node 0, zone Normal
min 2560
low 3200
high 3840
managed 63279
high: 90
以上任何一个数值的单位是4K,所以managed的实际内存=63279*4=253116
计算公式:watemark[WMARK_MIN] = min_free_kbytes/4*zone.pages/zone.allpages
实际计算:watemark[WMARK_MIN] = 10240/4*63279/63279=2560
3、低端保留内存lowmem_reserve_ratio计算
[root@jdsh lib]$cat /proc/zoneinfo | grep -E "Node|managed|protection"
Node 0, zone Normal
managed 63279
protection: (0, 0)
[root@jdsh lib]$cat /proc/sys/vm/lowmem_reserve_ratio
32