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优先级接口功能说明
接口 | 说明 |
| 该接口用于设置是否启用memcg OOM优先级策略功能,取值为0或者1。该接口不会继承,默认值为0。
|
| 该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。
|
接口配置示例
按如下所示创建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
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令创建两个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
运行以下命令分别设置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
运行以下命令分别在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
运行以下命令分别设置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操作,因为它的优先级比其他的兄弟节点低。