当系统分配内存并在相应的Memcg中统计达到Memcg设定的内存上限时,将触发Memcg级别的直接内存回收。直接内存回收是在内存分配上下文中同步进行的,会影响当前进程的性能。Alibaba Cloud Linux 2(内核4.19.81-17.al7
及以上版本)和Alibaba Cloud Linux 3(内核5.10.134-12.al8
及以上版本)新增了Memcg粒度的后台异步回收功能,从而动态、高效的管理cgroup内存使用,避免资源耗尽。
当前Memcg的内存分配,可能会递归触发父组的后台异步回收。
触发Memcg后台异步回收时,会从当前被触发的Memcg开始,自上而下做层级回收。
在配置了
memory.high
接口并且memory.high
的值小于memory.limit_in_bytes
接口的值时,接口memory.wmark_high
和memory.wmark_low
水位线的计算将基于memory.high
而非memory.limit_in_bytes
。
memcg后台异步回收功能接口说明
接口 | 说明 |
| 设置是否启用Memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。 单位:相对于 取值范围:0~100。
|
| Memcg内存使用超过该接口的值时,后台异步回收功能启动。 只读接口,说明如下:
|
| memcg内存使用低于该接口的值时,后台异步回收结束。 只读接口,说明如下:
|
| 控制 单位:相对于 取值范围:1~1000。
|
接口配置示例
创建测试文件。
sudo mkdir /sys/fs/cgroup/memory/test/
设置内存使用量限制接口
memory.limit_in_bytes
。本示例限制为1 G。
sudo sh -c 'echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes'
配置
memory.wmark_ratio
接口。以设置异步回收功能开始工作的
memcg
内存水位线为memcg limit
的95%为例。sudo sh -c 'echo 95 > /sys/fs/cgroup/memory/test/memory.wmark_ratio'
查看memcg内存控制组中接口的值。
查看
memory.wmark_scale_factor
接口的值。cat /sys/fs/cgroup/memory/test/memory.wmark_scale_factor
默认值为
memcg limit
的千分之五。接口值返回示例:50。查看
memory.wmark_high
接口的值。cat /sys/fs/cgroup/memory/test/memory.wmark_high
查看
memory.wmark_low
接口的值。cat /sys/fs/cgroup/memory/test/memory.wmark_low