全部產品
Search
文件中心

Alibaba Cloud Linux:Memcg全域最低水位線分級功能最佳化記憶體回收

更新時間:Aug 10, 2024

在Linux系統中,當時延敏感型業務和資源消耗型任務共同部署時,資源消耗型任務經常會瞬間申請大量的記憶體,導致系統的空閑記憶體觸及全域最低水位線,從而引發時延敏感型業務的效能抖動。因此,Alibaba Cloud Linux 2(核心4.19.91-18.al7及以上版本)和Alibaba Cloud Linux 3(核心5.10.134-12.al8及以上版本)新增了Memcg全域最低水位線分級功能,通過設定不同層級的記憶體使用量閾值(即水位線)來保障延敏感型業務和資源消耗型任務的記憶體需求,避免不必要的記憶體回收操作對系統的影響。

功能介面說明

實現memcg全域最低水位線分級功能的介面為memory.wmark_min_adj。該介面的值表示對全域最低水位線(global wmark_min)所作出的調整(adjustment)百分比。取值範圍:-25~50,具體說明如下:

  • 該介面建立時,繼承父組的值(值為0),即預設值為0。

  • 取值範圍中的負值是基於調整範圍[0, WMARK_MIN]的百分比,其中WMARK_MIN表示global wmark_min的值,例如:

    memory.wmark_min_adj=-25, memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)"
    說明

    負值表示global wmark_min下移,即提高時延敏感型業務的記憶體子系統服務品質(memcg QoS)。

  • 取值範圍中的正值是基於調整範圍[WMARK_MIN, WMARK_LOW]的百分比,其中WMARK_MIN和WMARK_LOW分別表示global wmark_minglobal wmark_low的值,例如:

    memory.wmark_min_adj=50, memcg WMARK_MIN is "WMARK_MIN + (WMARK_LOW - WMARK_MIN) * 50%"
    說明

    正值表示global wmark_min上移,即降低資源消耗型任務的記憶體子系統服務品質(memcg QoS)。

  • 當位移後的global wmark_min被觸發後,會執行抑制操作,抑制操作的時間和超出的記憶體使用量為線性關係。抑制時間的取值範圍:1 ms~1000 ms。

    說明

    memcg根組目錄下不存在該介面檔案。

介面注意事項

在多層級目錄的memcg中,有一個effective memory.wmark_min_adj的概念,即最終生效的memory.wmark_min_adj值是Memcg層級路徑上遍曆取得的最大值(中間節點的預設值0除外)。例如,有以下層級關係樣本。

         root
         / \
        A   D
       / \
      B   C
     / \
    E   F

各層級設定的介面值與最終生效的介面值,對應關係如下所示。

層級

各層級設定的介面值

最終生效的介面值

A

-10

-10

B

-25

-10

C

0

0

D

50

50

E

-25

-10

F

50

50

說明
  • 運行命令cat /sys/fs/cgroup/memory/<memcg path>/memory.wmark_min_adj輸出的值為最終生效的值,其中變數<memcg path>是Memcg的根路徑。

  • 建議配合較高的全域最低水位線(global wmark_min)來使用,例如將global wmark_min值設定為2 GB或更高。您可以通過/proc/sys/vm/min_free_kbytes進行設定。

功能配置樣本

警告
  • 修改Memcg QoS值不合理可能會造成網路品質下降,引起網路擁塞、增加轉寄時延、產生丟包等問題,導致業務品質下降甚至不可用。請謹慎執行。

  • 操作以下命令僅使用root使用者。

樣本一:為時延敏感型業務所在Memcg配置全域最低水位線分級。

  1. 建立測試檔案。

    mkdir /sys/fs/cgroup/memory/test-lc
  2. 配置全域最低水位線為-25。

    echo -25 > /sys/fs/cgroup/memory/test-lc/memory.wmark_min_adj

樣本二:為資源消耗型任務所在Memcg配置全域最低水位線分級。

  1. 建立測試檔案。

    mkdir /sys/fs/cgroup/memory/test-be
  2. 配置全域最低水位線為25。

    echo 25 > /sys/fs/cgroup/memory/test-be/memory.wmark_min_adj