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