Memcg后台异步回收内存

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

当系统分配内存并在相应的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_highmemory.wmark_low水位线的计算将基于memory.high而非memory.limit_in_bytes

memcg后台异步回收功能接口说明

接口

说明

memory.wmark_ratio

设置是否启用Memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。

单位:相对于memcg limit的百分比。

取值范围:0~100。

  • 默认值为0,表示禁用memcg后台异步回收功能。

  • 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。

memory.wmark_high

Memcg内存使用超过该接口的值时,后台异步回收功能启动。

只读接口,说明如下:

  • 该接口的值由memory.limit_in_bytes * memory.wmark_ratio / 100计算获得。

  • memcg后台异步回收功能被禁用时,memory.wmark_high默认为一个最大值,从而达到永不触发后台异步回收功能的目的。

  • memcg根组目录下不存在该接口文件。

memory.wmark_low

memcg内存使用低于该接口的值时,后台异步回收结束。

只读接口,说明如下:

  • 该接口的值由memory.wmark_high - memory.limit_in_bytes * memory.wmark_scale_factor / 10000计算得出。

  • memcg根组目录下不存在该接口文件。

memory.wmark_scale_factor

控制memory.wmark_highmemory.wmark_low之间的间隔。

单位:相对于memcg limit的万分比。

取值范围:1~1000。

  • 在创建该接口时,会继承父组的值(默认为50),即为memcg limit的千分之五。

  • memcg根组目录不存在该接口文件。

接口配置示例

  1. 创建测试文件。

    sudo mkdir /sys/fs/cgroup/memory/test/
  2. 设置内存使用量限制接口memory.limit_in_bytes

    本示例限制为1 G。

    sudo sh -c 'echo 1G > /sys/fs/cgroup/memory/test/memory.limit_in_bytes'
  3. 配置memory.wmark_ratio接口。

    以设置异步回收功能开始工作的memcg内存水位线为memcg limit的95%为例。

    sudo sh -c 'echo 95 > /sys/fs/cgroup/memory/test/memory.wmark_ratio'
  4. 查看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