Memcg OOM优先级策略功能

Alibaba Cloud Linux 2(内核版本4.19.91-18.al7开始)和Alibaba Cloud Linux 3(内核版本5.10.60-9.al8开始)新增内存子系统(memcg)内存溢出OOM(Out Of Memory)优先级策略功能。本文主要介绍实现memcg OOM优先级策略功能的接口,以及接口的示例说明。

背景信息

在现有内核系统中,内存紧张情况下内核会遍历cgroup,选择耗用内存较多的cgroup进行内存回收,甚至在回收失败的情况下直接OOM,并停止当前cgroup下的所有任务。这对于当前cgroup包含的核心业务来说,会造成很大的影响。为此我们希望这类包含核心业务的cgroup占有的内存不被回收,或者cgroup下的任务在OOM中可以存活下来,以便让内核去选择其他的cgroup进行内存回收或者OOM。

为了解决这个问题,Alibaba Cloud Linux增加了memcg OOM优先级配置功能。该功能在进行OOM操作时,会首先判定cgroup的优先级,选择低优先级的cgroup进行OOM操作。

memcg OOM优先级接口功能说明

接口

说明

memory.use_priority_oom

该接口用于设置是否启用memcg OOM优先级策略功能,取值为0或者1。该接口不会继承,默认值为0。

  • 取值为0时,表示禁用memcg OOM优先级策略功能。

  • 取值为1时,表示开启memcgOOM优先级策略功能。

memory.priority

该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。

  • 实现一定程度的内存QoS,此处需要说明的优先级值非全局变量,只能在同父cgroup下的兄弟节点进行比较。

  • 对于优先级相等的兄弟节点来说,会按照组的内存使用量来排序选择内存使用最大的进行OOM操作。

接口配置示例

按如下所示创建6个cgroup子节点A、 B、 C、 D、 E、 F,开启memory.use_priority_oom接口,并通过memory.priority接口设置OOM的优先级。

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

则各层级设置的接口值,对应关系如下所示:

  • A:10

  • B:8

  • C:5

  • D:6

  • E:7

  • F:8

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令创建两个cgroup节点 A、B,并开启memcg OOM优先级策略功能。

    mkdir /sys/fs/cgroup/memory/A
    cd /sys/fs/cgroup/memory/A
    echo 1 >memory.use_priority_oom
    mkdir /sys/fs/cgroup/memory/B
    cd /sys/fs/cgroup/memory/B
    echo 1 >memory.use_priority_oom
  3. 运行以下命令分别设置A、B节点的memcg OOM优先级值为10、8。

    cd /sys/fs/cgroup/memory/A
    echo 10 > memory.priority
    cd /sys/fs/cgroup/memory/B
    echo 8 > memory.priority
  4. 运行以下命令分别在A节点下创建C、D子节点,在B节点下创建E、F子节点, 并开启memcg OOM优先级策略功能。

    mkdir /sys/fs/cgroup/memory/A/C
    cd /sys/fs/cgroup/memory/A/C
    echo 1 >memory.use_priority_oom
    mkdir /sys/fs/cgroup/memory/A/D
    cd /sys/fs/cgroup/memory/A/D
    echo 1 >memory.use_priority_oom
    mkdir /sys/fs/cgroup/memory/B/E
    cd /sys/fs/cgroup/memory/B/E
    echo 1 >memory.use_priority_oom
    mkdir /sys/fs/cgroup/memory/B/F
    cd /sys/fs/cgroup/memory/B/F
    echo 1 >memory.use_priority_oom
  5. 运行以下命令分别设置C、D、E、F子节点的memcg OOM优先级值为5、6、7、8。

    cd /sys/fs/cgroup/memory/A/C
    echo 5 > memory.priority
    cd /sys/fs/cgroup/memory/A/D
    echo 6 > memory.priority
    cd /sys/fs/cgroup/memory/B/E
    echo 7 > memory.priority
    cd /sys/fs/cgroup/memory/B/F
    echo 8 > memory.priority

当在root中进行OOM操作时,它首先迭代查找它的两个子节点A和B,由于B的优先级值低于A,所以会选择B节点作为下一个迭代cgroup继续进行迭代,最终会在子节点E上进行OOM操作,因为它的优先级比其他的兄弟节点低。