• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 内存管理部件
2
3- [内存管理部件](#内存管理部件)
4	- [简介<a name="section_introduction"></a>](#简介)
5	- [目录<a name="section_catalogue"></a>](#目录)
6	- [框架<a name="section_framework"></a>](#框架)
7		- [进程回收优先级列表<a name="section_prio"></a>](#进程回收优先级列表)
8		- [回收策略/查杀策略<a name="section_reclaim"></a>](#回收策略查杀策略)
9	- [使用说明<a name="section_usage"></a>](#使用说明)
10	- [参数配置说明<a name="section_usage"></a>](#参数配置说明)
11		- [availbufferSize](#availbuffersize)
12		- [ZswapdParam](#zswapdparam)
13		- [killConfig](#killconfig)
14		- [nandlife](#nandlife)
15	- [相关仓<a name="section_projects"></a>](#相关仓)
16
17## 简介<a name="section_introduction"></a>
18
19内存管理部件位于全局资源调度管控子系统中,基于应用的生命周期状态,更新进程回收优先级列表,通过内存回收、查杀等手段管理系统内存,保障内存供给。
20
21## 目录<a name="section_catalogue"></a>
22
23```
24/foundation/resourceschedule/memmgr
25├── common           						# 部件通用工具类
26│   ├── include
27│   │   ├── kernel_interface.h				# 封装了与Kernel交互的接口
28│   │   ├── memmgr_log.h					# 封装了hilog,用于日志打印
29│   │   └── single_instance.h				# 封装了单例模式的类模板
30│   └── src
31│       └── kernel_interface.cpp
3233|
34├── sa_profile       						# 组件服务配置
35|
36├── services         						# 组件服务实现
37|   └── memmgrservice    					# 对内接口目录
38|       ├── include
39|       |   ├── event						# 事件注册中心目录
40|       |   ├── reclaim_priority_manager	# 进程回收优先级管理目录
41|       |   ├── reclaim_strategy			# 回收策略目录
42|       |   └── kill_strategy				# 查杀策略目录
43|       └── src
44|           ├── event
45|           ├── reclaim_priority_manager
46|           ├── reclaim_strategy
47|           └── kill_strategry
48|
49└── test 									# 自测试用例目录
50```
51## 框架<a name="section_framework"></a>
52
53内存管理部件主要基于事件触发回收优先级更新,并基于回收优先级管理内存回收和查杀,其框架如下所示(下图虚线右侧为本部件),主要分为如下几个模块:
54
551、事件管理模块:统筹管理本部件所要对外响应的事件。主要功能为调用其他子系统提供的接口注册事件监听,并将事件通知到回收优先级管理模块、回收策略模块和查杀策略模块。
56
572、回收优先级管理模块:基于事件管理模块的应用和用户的事件通知,给出进程的回收和查杀的先后顺序列表,并向回收策略和查杀策略提供查询此列表的接口。
58
593、回收策略模块:根据回收优先级列表,调整回收内存水线、文件页/匿名页回收比例、压缩/换出比例等回收参数,以及协调不同回收机制协同工作,保障内存中低负载下的供给性能。
60
614、查杀策略模块:作为回收的逻辑末端,根据回收优先级列表,保障内存重负载下的内存供给。
62
635、Kernel接口管控模块:负责将回收参数、查杀等管控命令下发到Kernel。
64
656、内存特性配置:读取回收策略模块、查杀策略模块等需要的配置文件。
66
677、磁盘寿命管控(规划中):控制磁盘写入量,以保障磁盘寿命。
68
69![](figures/zh-cn_image_fwk.png)
70
71### 进程回收优先级列表<a name="section_prio"></a>
72
73进程回收优先级列表,提供了进程间回收和查杀的先后顺序列表。本部件定义的进程回收优先级及其对应的描述如下表所示:
74
75| 优先级                                                                                   | 描述     |
76|------------------------------------------------------------------------------------------|-------------|
77| -1000 | 系统进程,属于该优先级的进程不会被查杀策略查杀,支持白名单配置 |
78| -800 | 常驻进程,属于该优先级的进程可以被查杀,但优先级较低,且被杀后可以再被拉起,支持白名单配置 |
79| 0 | 前台应用。 |
80| 100 | 正在进行后台短时任务的应用; 或者有被进程关联的extension进程 |
81| 200 | 后台可感知应用,如正在执行导航、播放音乐等长时任务的应用 |
82| 260 | 连接着分布式设备的后台应用 |
83| 400 | 普通后台应用及无被任何进程关联的extension进程 |
84
85
86### 回收策略/查杀策略<a name="section_reclaim"></a>
87
88查杀作为回收的逻辑末端,与回收策略一脉相承,因此两者使用相同的进程回收优先级列表,同时也要协同管控,协调两者触发时机,共同保障不同内存负载下的内存供给功能和性能。
89
90- **回收策略**:回收策略是垂直内存管理的重中之重。回收策略管控了多种不同的内存回收机制,需要协调好不同机制,例如Purgeable/Speculative内存(规划中)的回收要先于其他内存,再例如回收触发时机要先于低内存查杀。
91
92  在内存低负载时,可以将热点文件cache在内存中以提升性能(规划中)。
93
94  内存中负载时,配置kswapd/zswapd等回收进程的内存水线(阈值)以及相应的回收参数,指导kswapd/zswapd工作。
95
96  对于如下单点关键事件,例如大内存需求的相机场景,可以通过“场景处理”模块单点配置,根据业务需求预回收(规划中);再例如查杀场景,要停止kswapd/zswapd的基本动作,避免无效回收。
97
98- **查杀策略**:查杀主要负责内存重负载场景。由内存压力事件( Pressure Stall Information )触发,根据查杀内存水线,从进程回收优先级列表中选择低优先级进程进行清理。
99
100  默认的查杀内存水线与可杀进程回收优先级对应关系如下表所示。未来,系统开发者和产品开发者可以根据内存RAM(Random Access Memory)规格、屏幕尺寸等需求通过修改xml配置修改该对应关系(xml配置暂不支持,规划中)。
101
102  | 查杀内存水线 | 进程回收优先级 |
103  | ------------ | -------------- |
104  | 500 MB       | 400            |
105  | 400 MB       | 300            |
106  | 300 MB       | 200            |
107  | 200 MB       | 100            |
108  | 100 MB       | 0              |
109
110
111
112## 使用说明<a name="section_usage"></a>
113
114系统开发者可以通过配置productdefine/common/products下的产品定义json文件,增加或移除本部件,来启用或停用本部件。
115
116` "resourceschedule:memmgr":{} `
117
118## 参数配置说明<a name="section_usage"></a>
119
120产品可通过memmgr_config.xml来配置本模块相关参数,路径为/etc/memmgr/memmgr_config.xml
121
122xml样例:
123
124```
125<?xml version="1.0" encoding="UTF-8"?>
126<Memmgr>
127	<reclaimConfig>
128		<availbufferSize>
129			<availBuffer>800</availBuffer>
130			<minAvailBuffer>750</minAvailBuffer>
131			<highAvailBuffer>850</highAvailBuffer>
132			<swapReserve>200</swapReserve>
133		</availbufferiSize>
134		<ZswapdParam id="1">
135			<minScore>0</minScore>
136			<maxScore>500</maxScore>
137			<mem2zramRatio>60</mem2zramRatio>
138			<zran2ufsRation>10</zran2ufsRation>
139			<refaultThreshold>50</refaultThreshold>
140		</ZswapdParam>
141		<ZswapdParam id="2">
142			<minScore>501</minScore>
143			<maxScore>1000</maxScore>
144			<mem2zramRatio>70</mem2zramRatio>
145			<zran2ufsRation>20</zran2ufsRation>
146			<refaultThreshold>60</refaultThreshold>
147		</ZswapdParam>
148	</reclaimConfig>
149	<killConfig>
150		<killLevel id="1">
151			<memoryMB>500</memoryMB>
152			<minPriority>400</minPriority>
153		</killLevel>
154		<killLevel id="2">
155			<memoryMB>400</memoryMB>
156			<minPriority>300</minPriority>
157		</killLevel>
158	</killConfig>
159	<nandlife>
160		<dailySwapOutQuotaMB>50</dailySwapOutQuotaMB>
161		<totalSwapOutQuotaMB>199</totalSwapOutQuotaMB>
162	</nandlife>
163</Memmgr>
164```
165
166功能参考: [详见Enhanced SWAP特性介绍](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/kernel/kernel-standard-mm-eswap.md)
167
168### availbufferSize
169
170| 节点名                                                                                   | 功能说明     | 默认值 |
171|------------------------------------------------------------------------------------------|-------------|-------------|
172| availBuffer | 期望的内存正常状态buffer值 |800|
173| minAvailBuffer | 检测到当前的buffer低于min_avail_buffers时则会唤醒zswapd进行匿名页回收 |750|
174| highAvailBuffer | 期望的回收量为high_avail_buffers与当前系统buffer值的差值 |850|
175| swapReserve | 交换分区空闲容量的阈值 |200|
176
177
178限制:
179* 0 <= minAvailBuffer <= availBuffer <= highAvailBuffer <= memTotal
180* 0 <=swapReserve <=memTotal
181
182### ZswapdParam
183
184| 节点名                                                                                   | 功能说明     | 默认值 |
185|------------------------------------------------------------------------------------------|-------------|-------------|
186| minScore | 期望的内存正常状态buffer值 |0|
187| maxScore | 检测到当前的buffer低于min_avail_buffers时则会唤醒zswapd进行匿名页回收 |1000|
188| mem2zramRatio | 内存压缩到ZRAM的比率 |60|
189| zran2ufsRation | ZRAM换出到ESwap的比率 |10|
190| refaultThreshold | refault的阈值 |50|
191
192限制:
193* 0<=minScore<=1000
194* 0<=maxScore<=1000
195* 0<=ub_mem2zram_ratio<=100
196* 0<=ub_zram2ufs_ratio<=100
197* 0<=refault_threshold<=100
198
199### killConfig
200内存查杀相关配置
201
202| 节点名                                                                                   | 功能说明     | 默认值 |
203|------------------------------------------------------------------------------------------|-------------|-------------|
204| killLevel | 查杀级别 |无|
205| memoryMB | 查杀目标内存阈值 |无|
206| minPriority | 可被查杀的adj最小值 |无|
207
208### nandlife
209寿命管控相关配置
210| 节点名                                                                                   | 功能说明     | 默认值 |
211|------------------------------------------------------------------------------------------|-------------|-------------|
212| dailySwapOutQuotaMB | 每日换出量限制(单位MB),应为正数 |0|
213| totalSwapOutQuotaMB | 总换出量限制(单位MB),应为正数 |0|
214
215## 相关仓<a name="section_projects"></a>
216
217全局资源调度子系统
218
219resource_schedule_service
220
221
222
223