Alibaba Cloud Linux 2(核心版本4.19.91-24.al7
開始)和Alibaba Cloud Linux 3(核心版本5.10.46-7.al8
開始)支援Group Identity功能 ,您可以通過該功能為每一個CPU cgroup設定不同的身份標識,以區分不同CPU cgroup中進程任務的優先順序。
背景資訊
在業務的混合部署(延遲敏感型和計算型任務混合部署在同一台執行個體)情境中,Linux核心調度器需要為高優先順序任務賦予更多的調度機會,以最小化調度延遲,並將低優先順序任務對核心調度帶來的影響降到最低。基於該情境,Alibaba Cloud Linux提供了Group Identity功能,為CPU cgroup新增了配置調度優先順序的介面,且不同優先順序的任務具有以下特點:
高優先順序任務的喚醒延遲最小化。
低優先順序任務不會對高優先順序任務造成效能影響。主要體現在:
低優先順序任務的喚醒不會對高優先順序任務造成效能影響。
低優先順序任務不會通過共用硬體unit對高優先順序任務造成效能影響。
前提條件
當Alibaba Cloud Linux 2的核心版本(執行
uname -r
命令查詢)為4.19.91-26
、4.19.91-26.1
、4.19.91-26.2
或者4.19.91-26.3
時,核心配置中關閉了Group Identity,所以不支援使用Group Identity功能。當Alibaba Cloud Linux 3的核心版本為
5.10.112-11.al8
、5.10.112-11.1.al8
、5.10.112-11.2.al8
、5.10.134-12.al8
、5.10.134-12.1.al8
或者5.10.134-12.2.al8
時,核心配置中關閉了Group Identity,所以不支援使用Group Identity功能。
當Alibaba Cloud Linux 2核心版本是
4.19.91-25.1.al7
~4.19.91-25.5.al7
時,Alibaba Cloud Linux 2使用Group Identity功能時會出現宕機現象。請先升級核心版本至4.19.91-25.6.al7
或更高版本。具體操作,請參見升級核心。當Alibaba Cloud Linux 3核心版本是
5.10.134-12.2.al8
且系統架構為x86_64時,可以通過如下方式使用Group Identity功能。yum makecache sudo yum install scheduler-group-identity.x86_64 -y
當Alibaba Cloud Linux 2的核心版本大於等於
4.19.91-26.4
、Alibaba Cloud Linux 3的核心版本大於等於5.10.134-13.al8
時,Group Identity新增開關/proc/sys/kernel/sched_group_identity_enabled
。在使用Group Identity之前需要先執行sudo sh -c 'echo 1 > /proc/sys/kernel/sched_group_identity_enabled'
命令,開啟該開關,否則無法使用Group Identity功能。
功能原理
Group Identity功能可以對每一個CPU cgroup設定身份標識,以區分cgroup中的任務優先順序。Group Identity核心是雙紅/黑樹狀結構設計,在CFS(Completely Fair Scheduler)調度隊列的單紅/黑樹狀結構基礎上,新增了一棵低優先順序的紅/黑樹狀結構,用於存放低優先順序任務。
系統核心在調度包含具有身份標識的任務時,會根據不同的優先順序做相應處理。具體說明如下表:
身份標識(按優先順序由高到低排序) | 說明 |
| 高優先順序任務,相較於低於其優先順序的任務會有更多的資源搶佔機會。 CFS調度器在調度高優先順序任務時,會有以下行為的變化:
|
| 普通優先順序任務,相較於低於其優先順序的任務會有更多的資源搶佔機會。 CFS調度器在調度普通優先順序任務時,會有以下行為的變化:
|
| 低優先順序任務。 CFS調度器在調度低優先順序任務時,會有以下行為的變化: 如果SMT對端CPU運行了SMT驅逐者( |
以上身份標識的作用範圍遵從CPU cgroup的資源管理原則:
在同一層級的cgroup中的任務,身份標識的優先順序生效。
相對於父層級的cgroup,任務身份標識的優先順序不生效;相對於子層級的cgroup,任務身份標識的優先順序生效。
同優先順序的身份標識之間的資源競爭基本服從CFS調度器的策略,但需要注意
ID_UNDERCLASS
、ID_NORMAL
身份標識的任務沒有最小已耗用時間的保障。
其他身份標識說明:
身份標識 | 說明 |
| SMT驅逐者,當其被調度到CPU上運行時,驅逐SMT對端CPU上的 |
| 表示當任務被喚醒時,會在調度器策略範圍內最大限度地嘗試找到空閑CPU(Idle CPU)。 |
| 與核心參數 |
介面說明
身份標識配置介面
Group Identity提供了兩個用於設定任務身份標識的介面:
/sys/fs/cgroup/cpu/$cg/cpu.identity
與/sys/fs/cgroup/cpu/$cg/cpu.bvt_warp_ns
。其中變數$cg
表示任務實際所在的子cgroup目錄節點。在使用身份標識配置介面前,您需要注意:cpu.bvt_warp_ns
介面是快捷配置介面,寫入後會轉換為identity。cpu.identity
介面與cpu.bvt_warp_ns
介面都是對cgroup的identity做更改。cpu.identity
介面寫入後會覆蓋cpu.bvt_warp_ns
介面上次的寫入值,但不會在cpu.bvt_warp_ns
介面中體現。cpu.bvt_warp_ns
介面寫入後會覆蓋cpu.identity
介面上次的寫入值,但不會在cpu.identity
介面中體現。您只需要使用任一介面設定任務的身份標識,不建議同時設定兩個介面。
如果您不熟悉作業系統核心的相關操作,不建議使用
cpu.identity
介面。
介面說明如下:
介面
說明
cpu.identity
預設取值為0,表示身份標識為
ID_NORMAL
。該介面是一個位段,一共有5個位元位,該介面各個位元位的取值說明如下:
空值:表示身份標識為
ID_NORMAL
。位元位0:表示身份標識為
ID_UNDERCLASS
。位元位1:表示身份標識為
ID_HIGHCLASS
。位元位2:表示身份標識為
ID_SMT_EXPELLER
。位元位3:表示身份標識為
ID_IDLE_SAVER
。位元位4:表示身份標識為
ID_IDLE_SEEKER
。
例如,如果設定一個cgroup的身份標識為
ID_HIGHCLASS
和ID_IDLE_SEEKER
,那麼將位元位1和4置為1,其他位元位置為0,得到的二進位表示為:10010,轉化為十進位為:18,則執行echo 18 > /sys/fs/cgroup/cpu/$cg/cpu.identity
即可完成寫入。cpu.bvt_warp_ns
預設取值為0,表示身份標識為
ID_NORMAL
。該介面的取值說明如下:2:表示同時具有身份標識
ID_SMT_EXPELLER
、ID_IDLE_SEEKER
、ID_HIGHCLASS
,對應的identity值為22。1:表示同時具有身份標識
ID_HIGHCLASS
、ID_IDLE_SEEKER
,對應的identity值為18。0:表示身份標識為
ID_NORMAL
,對應的identity值為0。-1:表示同時具有身份標識
ID_UNDERCLASS
、ID_IDLE_SAVER
,對應的identity值為9。-2:表示同時具有身份標識
ID_UNDERCLASS
、ID_IDLE_SAVER
,對應的identity值為9。
說明Alibaba Cloud Linux預設支援cgroup v1介面,在Alibaba Cloud Linux 3核心版本大於等於
5.10.134-13
的5.10核心中,Group Identity也支援cgroup v2介面/sys/fs/cgroup/$cg/cpu.identity
與/sys/fs/cgroup/$cg/cpu.bvt_warp_ns
,其中變數$cg
表示任務實際所在的子cgroup目錄節點。調度特性開關配置介面
運行以下命令,您可以通過
sched_features
介面查看到核心調度特性的預設配置。sudo cat /sys/kernel/debug/sched_features
具體說明如下:
調度特性
說明
預設值
ID_IDLE_AVG
該特性與
ID_IDLE_SAVER
身份標識配合,把ID_UNDERCLASS
任務的已耗用時間計入空閑時間長度,防止只有ID_UNDERCLASS
任務運行時仍保留空閑CPU(Idle CPU)的問題,避免資源浪費。ID_IDLE_AVG
:表示特性為啟用狀態。ID_RESCUE_EXPELLEE
該特性作用於負載平衡情境,如果任務無法找到可用的CPU資源,則進行中驅逐
ID_UNDERCLASS
任務的CPU會成為負載平衡的目標。用於協助ID_UNDERCLASS
任務儘快擺脫被驅逐的狀態。ID_RESCUE_EXPELLEE
:表示特性為啟用狀態。ID_EXPELLEE_NEVER_HOT
該特性被啟用後,正在被驅逐的任務在判斷是否需要遷移至其他CPU時,不會因為熱緩衝的原因而造成拒絕遷移。用於協助
ID_UNDERCLASS
任務儘快擺脫被驅逐的狀態。NO_ID_EXPELLEE_NEVER_HOT
:表示特性為關閉狀態。ID_LOOSE_EXPEL
該特性被啟用後,CPU不會在每次選擇任務時更新驅逐狀態,而是根據核心參數
sched_expel_update_interval
設定的時間自動更新。該特性的開關僅影響CPU選擇任務時的狀態更新,不影響處理IPI中斷的更新。NO_ID_LOOSE_EXPEL
:表示特性為關閉狀態。ID_LAST_HIGHCLASS_STAY
該特性被啟用後,CPU上最後一個啟動並執行
ID_HIGHCLASS
任務不會被遷移至其他CPU。ID_LAST_HIGHCLASS_STAY
:表示特性為啟用狀態。ID_EXPELLER_SHARE_CORE
該特性開啟時允許
ID_SMT_EXPELLER
的任務優先選擇已經有ID_SMT_EXPELLER
任務的物理核,該特性關閉時則不允許。該特性關閉時可以儘可能地把
ID_SMT_EXPELLER
的任務分散到各個物理核上,從而避免ID_SMT_EXPELLER
任務之間的相互幹擾。
ID_EXPELLER_SHARE_CORE
:表示特性為啟用狀態。ID_ABSOLUTE_EXPEL
在Alibaba Cloud Linux 3的
5.10.134-16.3
核心中引入,在核心版本大於等於5.10.134-16.3
的5.10核心中可以使用。開啟該特性後,身份為ID_UNDERCLASS
的任務將受到絕對壓制,即運行隊列中只要有ID_NORMAL
或者ID_HIGHCLASS
任務,ID_UNDERCLASS
的任務就無法得到調度,最壞情況將導致ID_UNDERCLASS
任務餓死,因此開啟該特性前需評估混合部署情境中各種身份任務的負載情況。NO_ID_ABSOLUTE_EXPEL
:表示特性為關閉狀態。ID_LOAD_BALANCE
在Alibaba Cloud Linux 3的
5.10.134-16.3
核心中引入,在核心版本大於等於5.10.134-16.3
的5.10核心中可以使用。開啟該特性後,調度器在負載平衡時,會將只有ID_UNDERCLASS
任務的CPU視為空白閑CPU,並會嘗試將ID_HIGHCLASS
任務遷移到這種CPU上,會盡量將ID_HIGHCLASS
打散,避免ID_HIGHCLASS
任務之間的CPU競爭和HT幹擾,使每個ID_HIGHCLASS
任務都能獲得充足的CPU資源。NO_ID_LOAD_BALANCE
:表示特性為關閉狀態。用於
sysctl
配置核心參數的介面Group Identity的部分功能的實現需要以核心參數的取值作為參考。相關核心參數的具體說明如下表:
核心參數
說明
單位
預設值
/proc/sys/kernel/sched_expel_update_interval
CPU在選擇任務時,驅逐狀態的自動更新時間間隔。僅在
ID_LOOSE_EXPEL
特性開啟時生效。ms
10
/proc/sys/kernel/sched_expel_idle_balance_delay
CPU在驅逐狀態下,
idle balance
的最小時間間隔。取值為-1時表示不允許進行idle balance
。當CPU上均為
ID_UNDERCLASS
任務且任務在被驅逐時,CPU的狀態可以理解為空白閑狀態,在該狀態下CPU會進行idle balance
以提高負載平衡的效果,但會對ID_UNDERCLASS
任務造成損傷。通過設定sched_expel_idle_balance_delay
參數可以緩解該問題。ms
-1
/proc/sys/kernel/sched_idle_saver_wmark
設定CPU空閑時間的水位線。當
ID_IDLE_SAVER
任務被喚醒時,只會嘗試找到高於該水位線的空閑CPU,不會嘗試找到低於該水位線的空閑CPU。ns
0
/proc/sys/kernel/sched_group_identity_enabled
從
4.19.91-26.4
開始,Group Identity新增開關/proc/sys/kernel/sched_group_identity_enabled
。在使用Group Identity功能之前需要先執行echo 1 > /proc/sys/kernel/sched_group_identity_enabled
開啟該開關,否則將無法使用該功能。開啟該開關後,如果cgroup的
cpu.bvt_warp_ns
或者cpu.identity
非零,則無法向/proc/sys/kernel/sched_group_identity_enabled
介面寫入資料。說明當核心版本為
4.19.91-26.4.al7
、4.19.91-26.5.al7
、4.19.91-26.6.al7
時,如果sched_group_identity_enabled
已經被置為1,並且有cgroup的bvt被置為非零值,讀取/proc/sys/kernel/sched_group_identity_enabled
會報error
,這是介面讀取bug
,不影響正常使用。4.19.91-27.al7
以上版本的核心已修複該問題。不涉及
0
資訊輸出說明
在使用Group Identity功能期間,您可以運行以下命令,查看多維度參數資訊。
cat /proc/sched_debug
輸出的參數說明如下:
參數 | 說明 |
| 當前CPU上啟動並執行 |
| 當前CPU上啟動並執行 |
| 當前CPU上啟動並執行非 |
| 當前CPU是否有 |
| SMT調度器的對端是否有 |
| 當前CPU上 |
| 當前CPU上 |
| 當前 |
| CPU在驅逐任務的開始階段,兩個紅/黑樹狀結構結構的最小虛擬已耗用時間的差距。 |
| 由於CPU驅逐狀態造成的兩個紅/黑樹狀結構結構最小虛擬已耗用時間的累計差距。 |
| 低優先順序紅/黑樹狀結構結構的最小虛擬已耗用時間。 |