OpenHarmony之內存管理部件
- 內存管理部件
- 簡介
- 目錄
- 框架
- 進程回收優先級列表
- 補充
- 回收策略/查殺策略
- 進程回收優先級列表
- 使用說明
- 參數配置說明
- availbufferSize
- ZswapdParam
- killConfig
- nandlife
- 相關倉
簡介
內存管理部件位于全局資源調度管控子系統中,基于應用的生命周期狀態,更新進程回收優先級列表,通過內存回收、查殺等手段管理系統內存,保障內存供給。
目錄
/foundation/resourceschedule/memmgr
├── common # 部件通用工具類
│ ├── include
│ │ ├── kernel_interface.h # 封裝了與Kernel交互的接口
│ │ ├── memmgr_log.h # 封裝了hilog,用于日志打印
│ │ └── single_instance.h # 封裝了單例模式的類模板
│ └── src
│ └── kernel_interface.cpp
│
|
├── sa_profile # 組件服務配置
|
├── services # 組件服務實現
| └── memmgrservice # 對內接口目錄
| ├── include
| | ├── event # 事件注冊中心目錄
| | ├── reclaim_priority_manager # 進程回收優先級管理目錄
| | ├── reclaim_strategy # 回收策略目錄
| | └── kill_strategy # 查殺策略目錄
| └── src
| ├── event
| ├── reclaim_priority_manager
| ├── reclaim_strategy
| └── kill_strategry
|
└── test # 自測試用例目錄
框架
內存管理部件主要基于事件觸發回收優先級更新,并基于回收優先級管理內存回收和查殺,其框架如下所示(下圖虛線右側為本部件),主要分為如下幾個模塊:
1、事件管理模塊:統籌管理本部件所要對外響應的事件。主要功能為調用其他子系統提供的接口注冊事件監聽,并將事件通知到回收優先級管理模塊、回收策略模塊和查殺策略模塊。
2、回收優先級管理模塊:基于事件管理模塊的應用和用戶的事件通知,給出進程的回收和查殺的先后順序列表,并向回收策略和查殺策略提供查詢此列表的接口。
3、回收策略模塊:根據回收優先級列表,調整回收內存水線、文件頁/匿名頁回收比例、壓縮/換出比例等回收參數,以及協調不同回收機制協同工作,保障內存中低負載下的供給性能。
4、查殺策略模塊:作為回收的邏輯末端,根據回收優先級列表,保障內存重負載下的內存供給。
5、Kernel接口管控模塊:負責將回收參數、查殺等管控命令下發到Kernel。
6、內存特性配置:讀取回收策略模塊、查殺策略模塊等需要的配置文件。
7、磁盤壽命管控(規劃中):控制磁盤寫入量,以保障磁盤壽命。
進程回收優先級列表
進程回收優先級列表,提供了進程間回收和查殺的先后順序列表。本部件定義的進程回收優先級及其對應的描述如下表所示:
優先級 | 描述 |
---|---|
-1000 | 系統進程,屬于該優先級的進程不會被查殺策略查殺,支持白名單配置 |
-800 | 常駐進程,屬于該優先級的進程可以被查殺,但優先級較低,且被殺后可以再被拉起,支持白名單配置 |
0 | 前臺應用。 |
100 | 正在進行后臺短時任務的應用; 或者有被進程關聯的extension進程 |
200 | 后臺可感知應用,如正在執行導航、播放音樂等長時任務的應用 |
260 | 連接著分布式設備的后臺應用 |
400 | 普通后臺應用及無被任何進程關聯的extension進程 |
補充
- extension進程的優先級根據其關聯進程組進行更新,其值在關聯進程組最小優先級基礎上增加100
回收策略/查殺策略
查殺作為回收的邏輯末端,與回收策略一脈相承,因此兩者使用相同的進程回收優先級列表,同時也要協同管控,協調兩者觸發時機,共同保障不同內存負載下的內存供給功能和性能。
-
回收策略:回收策略是垂直內存管理的重中之重。回收策略管控了多種不同的內存回收機制,需要協調好不同機制,例如Purgeable/Speculative內存(規劃中)的回收要先于其他內存,再例如回收觸發時機要先于低內存查殺。
在內存低負載時,可以將熱點文件cache在內存中以提升性能(規劃中)。
內存中負載時,配置kswapd/zswapd等回收進程的內存水線(閾值)以及相應的回收參數,指導kswapd/zswapd工作。
對于如下單點關鍵事件,例如大內存需求的相機場景,可以通過“場景處理”模塊單點配置,根據業務需求預回收(規劃中);再例如查殺場景,要停止kswapd/zswapd的基本動作,避免無效回收。
-
查殺策略:查殺主要負責內存重負載場景。由內存壓力事件( Pressure Stall Information )觸發,根據查殺內存水線,從進程回收優先級列表中選擇低優先級進程進行清理。
默認的查殺內存水線與可殺進程回收優先級對應關系如下表所示。未來,系統開發者和產品開發者可以根據內存RAM(Random Access Memory)規格、屏幕尺寸等需求通過修改xml配置修改該對應關系(xml配置暫不支持,規劃中)。
查殺內存水線 進程回收優先級 500 MB 400 400 MB 300 300 MB 200 200 MB 100 100 MB 0
使用說明
系統開發者可以通過配置productdefine/common/products下的產品定義json文件,增加或移除本部件,來啟用或停用本部件。
"resourceschedule:memmgr":{}
參數配置說明
產品可通過memmgr_config.xml來配置本模塊相關參數,路徑為/etc/memmgr/memmgr_config.xml
xml樣例:
<?xml version="1.0" encoding="UTF-8"?>
<Memmgr><reclaimConfig><availbufferSize><availBuffer>800</availBuffer><minAvailBuffer>750</minAvailBuffer><highAvailBuffer>850</highAvailBuffer><swapReserve>200</swapReserve></availbufferiSize><ZswapdParam id="1"><minScore>0</minScore><maxScore>500</maxScore><mem2zramRatio>60</mem2zramRatio><zran2ufsRation>10</zran2ufsRation><refaultThreshold>50</refaultThreshold></ZswapdParam><ZswapdParam id="2"><minScore>501</minScore><maxScore>1000</maxScore><mem2zramRatio>70</mem2zramRatio><zran2ufsRation>20</zran2ufsRation><refaultThreshold>60</refaultThreshold></ZswapdParam></reclaimConfig><killConfig><killLevel id="1"><memoryMB>500</memoryMB><minPriority>400</minPriority></killLevel><killLevel id="2"><memoryMB>400</memoryMB><minPriority>300</minPriority></killLevel></killConfig><nandlife><dailySwapOutQuotaMB>50</dailySwapOutQuotaMB><totalSwapOutQuotaMB>199</totalSwapOutQuotaMB></nandlife>
</Memmgr>
功能參考: 詳見Enhanced SWAP特性介紹
availbufferSize
節點名 | 功能說明 | 默認值 |
---|---|---|
availBuffer | 期望的內存正常狀態buffer值 | 800 |
minAvailBuffer | 檢測到當前的buffer低于min_avail_buffers時則會喚醒zswapd進行匿名頁回收 | 750 |
highAvailBuffer | 期望的回收量為high_avail_buffers與當前系統buffer值的差值 | 850 |
swapReserve | 交換分區空閑容量的閾值 | 200 |
限制:
- 0 <= minAvailBuffer <= availBuffer <= highAvailBuffer <= memTotal
- 0 <=swapReserve <=memTotal
ZswapdParam
節點名 | 功能說明 | 默認值 |
---|---|---|
minScore | 期望的內存正常狀態buffer值 | 0 |
maxScore | 檢測到當前的buffer低于min_avail_buffers時則會喚醒zswapd進行匿名頁回收 | 1000 |
mem2zramRatio | 內存壓縮到ZRAM的比率 | 60 |
zran2ufsRation | ZRAM換出到ESwap的比率 | 10 |
refaultThreshold | refault的閾值 | 50 |
限制:
- 0<=minScore<=1000
- 0<=maxScore<=1000
- 0<=ub_mem2zram_ratio<=100
- 0<=ub_zram2ufs_ratio<=100
- 0<=refault_threshold<=100
killConfig
內存查殺相關配置
節點名 | 功能說明 | 默認值 |
---|---|---|
killLevel | 查殺級別 | 無 |
memoryMB | 查殺目標內存閾值 | 無 |
minPriority | 可被查殺的adj最小值 | 無 |
nandlife
壽命管控相關配置
節點名 | 功能說明 | 默認值 |
---|---|---|
dailySwapOutQuotaMB | 每日換出量限制(單位MB),應為正數 | 0 |
totalSwapOutQuotaMB | 總換出量限制(單位MB),應為正數 | 0 |
相關倉
全局資源調度子系統
resource_schedule_service