内存管理参数lowmem_reserve_ratio分析
Contents
在Linux
系统中,有很多内存管理的配置参数,本文就详细分析lowmem_reserve_ratio
参数。
系统环境介绍
- 发行版:
centos7.5
- 内核版本:3.10.0-862.14.4.el7.x86_64
- 处理器:
40core(Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz)
- 内存:
128GB
,两个NUMA node
官方解释
lowmem_reserve_ratio
的官方解释如下:
|
|
总的来说,就是防止进程过多的使用lower zones
中的内存。 具体实现如下:
- 系统上每个
zone
都会有一个protection
数组,在内存分配时,用它和对用的zone的watermark[high]
来判断是否能够分配内存 - 而每个
zone
的protection
的计算方法跟lowmem_reserve_ratio
有关。
接下来我们看一下每个zone
的protection
数组的计算方法。
zone
的protection
计算方法
lowmem_reserve_ratio
是一个数组,可以通过文件/proc/sys/vm/lowmem_reserve_ratio
查看其值:
|
|
目前该值为:
256
: 如果zone
为DMA
或者DMA32
32
: 其它zone
内核利用上述的lowmem_reserve_ratio
数组计算每个zone
的预留page
量,计算出来也是数组形式,从/proc/zoneinfo
里可以查看:
|
|
在进行内存分配时,这些预留页数值和watermark
相加来一起决定现在是满足分配请求,还是认为空闲内存量过低需要启动回收。
例如,如果一个normal
区(index = 2
)的页申请来试图分配DMA
区的内存,且现在使用的判断标准是watermark[high]
时,内核计算出 page_free = 1355
,而watermark + protection[2] = 4 + 2004 = 2008 > page_free
,则认为空闲内存太少而不予以分配。如果分配请求本就来自DMA zone
,则 protection[0] = 0
会被使用,而满足分配申请。
zone[i]
的 protection[j]
计算规则如下:
|
|
从上面的计算规则可以看出,预留内存值是ratio
的倒数关系,如果是256
则代表 1/256
,即为 0.39%
的高端zone
内存大小。
如果想要预留更多页,应该设更小一点的值,最小值是1
(1/1 -> 100%
)。
计算示例
根据上述计算方法,结合我的系统环境,计算出的每个zone
的protection
数组如下:
node | zone | manage_pages | protection[0] | protection[1] | protection[2] | protection[3] |
---|---|---|---|---|---|---|
0 | DMA | 3976 | 0 | 1383 | 63848 | 83848 |
0 | DMM32 | 354201 | 0 | 62464 | 62464 | |
0 | NORAML | 15991024 | 0 | 0 | ||
0 | MOVABLE | 0 | 0 | |||
1 | DMA | 0 | 0 | 0 | 64508 | 64508 |
1 | DMA32 | 0 | 0 | 64508 | 64508 | |
1 | NORMAL | 16514229 | 0 | 0 | ||
1 | MOVABLE | 0 | 0 |
通过/proc/zoneinfo
和crash
命令,我们可以验证一下计算结果是否正确:
|
|
lowmem_reserve_ratio
影响
通过分析,我们知道lowmem_reserve_ratio
会影响系统预留内存的大小,且预留的数量是ratio
的倒数,所以,如果系统预留稍微多一点的内存,应该将lowmem_reserve_ratio
适当调小。
一般情况下,很少回调整
lowmem_reserve_ratio
的值。