内核memory的OOM进程控制策略
背景信息
现有操作系统中,支持配置离线业务和在线业务。当内存发生OOM时,会优先选择离线业务控制组中的消耗内存最多的进程,结束进程回收内存,但是对于某些离线业务也有核心业务,因此会造成很大的影响。
针对这个问题,HCE调整了OOM时回收内存的策略,增加了配置cgroup优先级的功能。 内存紧张情况下内核会遍历cgroup,对低优先级的cgroup结束进程,并回收内存,使离线业务中重要的业务可以存活下来。
前提条件
vm.panic_on_oom接口默认开启,系统OOM时panic。故使用memcg OOM优先级配置时(即memcg_qos_enable配置为1或2),须先执行sysctl -w vm.panic_on_oom=0命令,关闭系统参数vm.panic_on_oom。
memcg OOM优先级接口功能说明
接口 |
说明 |
取值 |
---|---|---|
memcg_qos_enable |
memcg OOM优先级策略开关。
|
整数形式,取值范围为0~2,默认值为0。 |
memory.qos_level |
配置cgroup组优先级。值越小cgroup组优先级越低。
说明:
|
整数形式,取值范围为-1024~1023,默认值为0。 |
接口配置示例
按如下所示创建6个cgroup子节点A、B、C、D、E、F,配置memcg_qos_enable接口,并通过memory.qos_level接口设置OOM的优先级,优先级取值如图所示。
cgroup组 |
memory.qos_level取值 |
说明 |
---|---|---|
A |
-8 |
当在root中进行OOM操作时,内核遍历root所有cgroup组,最终选择优先级最低的A、E。由于A和E优先级相同,内核继续对A和E使用的内存进行比较。
|
B |
10 |
|
C |
1 |
|
D |
2 |
|
E |
-8 |
|
F |
3 |
- 关闭系统参数vm.panic_on_oom。
sysctl -w vm.panic_on_oom=0
- 开启memcg OOM优先级策略功能。
echo 1 > /proc/sys/vm/memcg_qos_enable
- 运行以下命令创建两个cgroup节点 A、B,并分别设置A、B节点的memcg OOM优先级值为-8、10。
mkdir /sys/fs/cgroup/memory/A mkdir /sys/fs/cgroup/memory/B cd /sys/fs/cgroup/memory/A echo -8 > memory.qos_level cd /sys/fs/cgroup/memory/B echo 10 > memory.qos_level
- 运行以下命令分别在A节点下创建C、D子节点,在B节点下创建E、F子节点, 并分别设置C、D、E、F子节点的memcg OOM优先级值为1、2、-8、3。
mkdir /sys/fs/cgroup/memory/A/C mkdir /sys/fs/cgroup/memory/A/D mkdir /sys/fs/cgroup/memory/B/E mkdir /sys/fs/cgroup/memory/B/F cd /sys/fs/cgroup/memory/A/C echo 1 > memory.qos_level cd /sys/fs/cgroup/memory/A/D echo 2 > memory.qos_level cd /sys/fs/cgroup/memory/B/E echo -8 > memory.qos_level cd /sys/fs/cgroup/memory/B/F echo 3 > memory.qos_level