在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_min
和global 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配置全域最低水位線分級。
建立測試檔案。
mkdir /sys/fs/cgroup/memory/test-lc
配置全域最低水位線為-25。
echo -25 > /sys/fs/cgroup/memory/test-lc/memory.wmark_min_adj
樣本二:為資源消耗型任務所在Memcg配置全域最低水位線分級。
建立測試檔案。
mkdir /sys/fs/cgroup/memory/test-be
配置全域最低水位線為25。
echo 25 > /sys/fs/cgroup/memory/test-be/memory.wmark_min_adj