全部產品
Search
文件中心

Alibaba Cloud Linux:Memcg OOM優先順序策略功能

更新時間:Jul 17, 2024

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優先順序介面功能說明

介面

說明

memory.use_priority_oom

該介面用於設定是否啟用memcg OOM優先順序策略功能,取值為0或者1。該介面不會繼承,預設值為0。

  • 取值為0時,表示禁用memcg OOM優先順序策略功能。

  • 取值為1時,表示開啟memcgOOM優先順序策略功能。

memory.priority

該介面提供13個層級的memcg優先順序以支援不同重要程度的業務。取值範圍為0~12,數值越大表示優先順序越高。該介面不會繼承,預設值為0。

  • 實現一定程度的記憶體QoS,此處需要說明的優先順序值非全域變數,只能在同父cgroup下的兄弟節點進行比較。

  • 對於優先順序相等的兄弟節點來說,會按照組的記憶體使用量量來排序選擇記憶體使用量最大的進行OOM操作。

介面配置樣本

按如下所示建立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

  1. 遠端連線ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 運行以下命令建立兩個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
  3. 運行以下命令分別設定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
  4. 運行以下命令分別在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
  5. 運行以下命令分別設定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操作,因為它的優先順序比其他的兄弟節點低。