
# cgroup异步内存回收
#### 需求背景
申请内存时，如果超过memory.high警示值，引发同步的内存回收任务，影响业务性能。
为解决此问题，HCE 2.0和HCE 3.0增加cgroup级别的异步内存回收功能。减少触发memory.high引发的同步内存回收，提高性能。
#### 约束与限制
memory.high_async_ratio异步内存回收需与memory.high共同发挥作用。
#### cgroup异步内存回收接口说明
cgroup级别异步回收功能的警戒水位线和安全水位线是基于memory.high和memory.high_async_ratio共同决定的。当内存申请达到警戒水位线时，会触发异步内存回收，尽可能将内存回收到安全水位线；当内存申请超过异步回收速度，达到memory.high警戒值，则会触发同步内存回收。
- 警戒水位线 = memory.high \* memory.high_async_ratio / 100
- 安全水位线 = memory.high \* (memory.high_async_ratio - 10) / 100
memory.high和memory.high_async_ratio的关系：
- 当memory.high一定时，memory.high_async_ratio取值越大，说明触发异步回收的阈值越高，不容易触发异步回收，但是容易触发同步回收，对于性能提高影响不大。
- 当memory.high一定时，memory.high_async_ratio取值越小，说明触发异步回收的阈值越低，可能导致过度起workqueue，异步回收动作实际不容易被调度到。
图1异步内存回收示意图   
![](https://support.huaweicloud.com/usermanual-hce/zh-cn_image_0000002480088962.png "点击放大")
表1memory.high_async_ratio接口说明 
| 接口                      | 说明                                                                                                                                                                                                                                                                                         |
|:---|:---|
| memory.high_async_ratio | 警戒水位线控制百分比。取值类型为整数形式，取值范围为11\~100，默认值为100（即不开启异步内存回收）。 - 读该接口可以查看警戒水位线控制百分比  - 写该接口可以设置警戒水位线控制百分比   |
   
#### 接口示例
1. 创建测试文件。
   ```
   mkdir /sys/fs/cgroup/memory/memcg_test_1/
   ```
   
2. 查看memory.high_async_ratio接口值。
   ```
   cat /sys/fs/cgroup/memory/memcg_test_1/memory.high_async_ratio
   100
   ```
   
3. 配置memory.high_async_ratio接口。
   ```
   echo 80 > /sys/fs/cgroup/memory/memcg_test_1/memory.high_async_ratio
   ```
   
4. 查看memory.high_async_ratio接口值。
   ```
   cat /sys/fs/cgroup/memory/memcg_test_1/memory.high_async_ratio
   80
   ```
   
 
