Memcg全局最低水位线分级功能优化内存回收

重要

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

在Linux系统中,当时延敏感型业务和资源消耗型任务共同部署时,资源消耗型任务经常会瞬间申请大量的内存,导致系统的空闲内存触及全局最低水位线,从而引发时延敏感型业务的性能抖动。因此,Alibaba Cloud Linux 2(内核4.19.91-18.al7及以上版本)和Alibaba Cloud Linux 3(内核5.10.134-12.al8及以上版本)新增了Memcg全局最低水位线分级功能,通过设置不同级别的内存使用阈值(即水位线)来保障延敏感型业务和资源消耗型任务的内存需求,避免不必要的内存回收操作对系统的影响。

功能接口说明

实现memcg全局最低水位线分级功能的接口为memory.wmark_min_adj。该接口的值表示对全局最低水位线(global wmark_min)所作出的调整(adjustment)百分比。取值范围:-25~50,具体说明如下:

  • 该接口创建时,继承父组的值(值为0),即默认值为0。

  • 取值范围中的负值是基于调整范围[0, WMARK_MIN]的百分比,其中WMARK_MIN表示global wmark_min的值,例如:

    memory.wmark_min_adj=-25, memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)"
    说明

    负值表示global wmark_min下移,即提高时延敏感型业务的内存子系统服务质量(memcg QoS)。

  • 取值范围中的正值是基于调整范围[WMARK_MIN, WMARK_LOW]的百分比,其中WMARK_MIN和WMARK_LOW分别表示global wmark_minglobal wmark_low的值,例如:

    memory.wmark_min_adj=50, memcg WMARK_MIN is "WMARK_MIN + (WMARK_LOW - WMARK_MIN) * 50%"
    说明

    正值表示global wmark_min上移,即降低资源消耗型任务的内存子系统服务质量(memcg QoS)。

  • 当偏移后的global wmark_min被触发后,会执行抑制操作,抑制操作的时间和超出的内存使用为线性关系。抑制时间的取值范围:1 ms~1000 ms。

    说明

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

接口注意事项

在多层级目录的memcg中,有一个effective memory.wmark_min_adj的概念,即最终生效的memory.wmark_min_adj值是Memcg层级路径上遍历取得的最大值(中间节点的默认值0除外)。例如,有以下层级关系示例。

         root
         / \
        A   D
       / \
      B   C
     / \
    E   F

各层级设置的接口值与最终生效的接口值,对应关系如下所示。

层级

各层级设置的接口值

最终生效的接口值

A

-10

-10

B

-25

-10

C

0

0

D

50

50

E

-25

-10

F

50

50

说明
  • 运行命令cat /sys/fs/cgroup/memory/<memcg path>/memory.wmark_min_adj输出的值为最终生效的值,其中变量<memcg path>是Memcg的根路径。

  • 建议配合较高的全局最低水位线(global wmark_min)来使用,例如将global wmark_min值设置为2 GB或更高。您可以通过/proc/sys/vm/min_free_kbytes进行设置。

功能配置示例

警告
  • 修改Memcg QoS值不合理可能会造成网络质量下降,引起网络拥塞、增加转发时延、产生丢包等问题,导致业务质量下降甚至不可用。请谨慎执行。

  • 操作以下命令仅使用root用户。

示例一:为时延敏感型业务所在Memcg配置全局最低水位线分级。

  1. 创建测试文件。

    mkdir /sys/fs/cgroup/memory/test-lc
  2. 配置全局最低水位线为-25。

    echo -25 > /sys/fs/cgroup/memory/test-lc/memory.wmark_min_adj

示例二:为资源消耗型任务所在Memcg配置全局最低水位线分级。

  1. 创建测试文件。

    mkdir /sys/fs/cgroup/memory/test-be
  2. 配置全局最低水位线为25。

    echo 25 > /sys/fs/cgroup/memory/test-be/memory.wmark_min_adj