Memcg OOM優(yōu)先級(jí)策略功能
Alibaba Cloud Linux 2(內(nèi)核版本4.19.91-18.al7
開始)和Alibaba Cloud Linux 3(內(nèi)核版本5.10.60-9.al8
開始)新增內(nèi)存子系統(tǒng)(memcg)內(nèi)存溢出OOM(Out Of Memory)優(yōu)先級(jí)策略功能。本文主要介紹實(shí)現(xiàn)memcg OOM優(yōu)先級(jí)策略功能的接口,以及接口的示例說明。
背景信息
在現(xiàn)有內(nèi)核系統(tǒng)中,內(nèi)存緊張情況下內(nèi)核會(huì)遍歷cgroup,選擇耗用內(nèi)存較多的cgroup進(jìn)行內(nèi)存回收,甚至在回收失敗的情況下直接OOM,并停止當(dāng)前cgroup下的所有任務(wù)。這對(duì)于當(dāng)前cgroup包含的核心業(yè)務(wù)來說,會(huì)造成很大的影響。為此我們希望這類包含核心業(yè)務(wù)的cgroup占有的內(nèi)存不被回收,或者cgroup下的任務(wù)在OOM中可以存活下來,以便讓內(nèi)核去選擇其他的cgroup進(jìn)行內(nèi)存回收或者OOM。
為了解決這個(gè)問題,Alibaba Cloud Linux增加了memcg OOM優(yōu)先級(jí)配置功能。該功能在進(jìn)行OOM操作時(shí),會(huì)首先判定cgroup的優(yōu)先級(jí),選擇低優(yōu)先級(jí)的cgroup進(jìn)行OOM操作。
memcg OOM優(yōu)先級(jí)接口功能說明
接口 | 說明 |
| 該接口用于設(shè)置是否啟用memcg OOM優(yōu)先級(jí)策略功能,取值為0或者1。該接口不會(huì)繼承,默認(rèn)值為0。
|
| 該接口提供13個(gè)級(jí)別的memcg優(yōu)先級(jí)以支持不同重要程度的業(yè)務(wù)。取值范圍為0~12,數(shù)值越大表示優(yōu)先級(jí)越高。該接口不會(huì)繼承,默認(rèn)值為0。
|
接口配置示例
按如下所示創(chuàng)建6個(gè)cgroup子節(jié)點(diǎn)A、 B、 C、 D、 E、 F,開啟memory.use_priority_oom
接口,并通過memory.priority
接口設(shè)置OOM的優(yōu)先級(jí)。
root
/ \
A B
/ \ / \
C D E F
則各層級(jí)設(shè)置的接口值,對(duì)應(yīng)關(guān)系如下所示:
A:10
B:8
C:5
D:6
E:7
F:8
遠(yuǎn)程連接ECS實(shí)例。
具體操作,請(qǐng)參見通過密碼或密鑰認(rèn)證登錄Linux實(shí)例。
運(yùn)行以下命令創(chuàng)建兩個(gè)cgroup節(jié)點(diǎn) A、B,并開啟memcg OOM優(yōu)先級(jí)策略功能。
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
運(yùn)行以下命令分別設(shè)置A、B節(jié)點(diǎn)的memcg OOM優(yōu)先級(jí)值為10、8。
cd /sys/fs/cgroup/memory/A echo 10 > memory.priority cd /sys/fs/cgroup/memory/B echo 8 > memory.priority
運(yùn)行以下命令分別在A節(jié)點(diǎn)下創(chuàng)建C、D子節(jié)點(diǎn),在B節(jié)點(diǎn)下創(chuàng)建E、F子節(jié)點(diǎn), 并開啟memcg OOM優(yōu)先級(jí)策略功能。
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
運(yùn)行以下命令分別設(shè)置C、D、E、F子節(jié)點(diǎn)的memcg OOM優(yōu)先級(jí)值為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
當(dāng)在root中進(jìn)行OOM操作時(shí),它首先迭代查找它的兩個(gè)子節(jié)點(diǎn)A和B,由于B的優(yōu)先級(jí)值低于A,所以會(huì)選擇B節(jié)點(diǎn)作為下一個(gè)迭代cgroup繼續(xù)進(jìn)行迭代,最終會(huì)在子節(jié)點(diǎn)E上進(jìn)行OOM操作,因?yàn)樗膬?yōu)先級(jí)比其他的兄弟節(jié)點(diǎn)低。