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操作,因為它的優先級比其他的兄弟節點低。