Alibaba Cloud Linux支持Group Identity功能(Alibaba Cloud Linux 2从内核版本kernel-4.19.91-24.al7
开始、Alibaba Cloud Linux 3从内核版本kernel-5.10.46-7.al8
开始) ,您可以通过该功能为每一个CPU cgroup设置不同的身份标识,以区分不同CPU cgroup中进程任务的优先级。
前提条件
- 当Alibaba Cloud Linux 2的内核版本(使用
uname -r
查询)是kernel-4.19.91-26
、kernel-4.19.91-26.1
、kernel-4.19.91-26.2
或者kernel-4.19.91-26.3
时,内核配置中关闭了Group Identity,所以不支持使用Group Identity功能。 - 当Alibaba Cloud Linux 3的内核版本(使用
uname -r
查询)是kernel-5.10.112-11.al8
、kernel-5.10.112-11.1.al8
、kernel-5.10.112-11.2.al8
、kernel-5.10.134-12.al8
、kernel-5.10.134-12.1.al8
或者kernel-5.10.134-12.2.al8
时,内核配置中关闭了Group Identity,所以不支持使用Group Identity功能。
- 当Alibaba Cloud Linux 2内核版本是
kernel-4.19.91-25.1.al7
~kernel-4.19.91-25.5.al7
时,Alibaba Cloud Linux 2使用Group Identity功能时会出现宕机现象。请先升级内核版本至kernel-4.19.91-25.6.al7
或更高版本。具体操作,请参见相关问题。 - 当Alibaba Cloud Linux3内核版本是
kernel-5.10.134-12.2.al8
且系统架构为x86_64时,可以通过如下方式使用Group Identity功能:yum makecache yum install scheduler-group-identity.x86_64
- 当Alibaba Cloud Linux 2的内核版本大于等于
kernel-4.19.91-26.4
、Alibaba Cloud Linux 3的内核版本大于等于kernel-5.10.134-13.al8
时,Group Identiy新增开关/proc/sys/kernel/sched_group_identity_enabled
。使用Group Identity之前需要先执行echo 1 > /proc/sys/kernel/sched_group_identity_enabled
命令打开该开关,否则无法使用Group Identiy功能。
背景信息
- 高优先级任务的唤醒延迟最小化。
- 低优先级任务不对高优先级任务造成性能影响。主要体现在:
- 低优先级任务的唤醒不会对高优先级任务造成性能影响。
- 低优先级任务不会通过共享硬件unit而对高优先级任务造成性能影响。
功能原理
Group Identity功能可以对每一个CPU cgroup设置身份标识,以区分cgroup中的任务优先级。Group Identity核心是双红黑树设计,在CFS(Completely Fair Scheduler)调度队列的单红黑树基础上,新增了一棵低优先级的红黑树,用于存放低优先级任务。
身份标识(按优先级由高到低排序) | 说明 |
---|---|
ID_HIGHCLASS | 高优先级任务,相较于低于其优先级的任务会有更多的资源抢占机会。 CFS调度器在调度高优先级任务时,会有以下行为的变化:
|
ID_NORMAL | 普通优先级任务,相较于低于其优先级的任务会有更多的资源抢占机会。 CFS调度器在调度普通优先级任务时,会有以下行为的变化:
|
ID_UNDERCLASS | 低优先级任务。 CFS调度器在调度低优先级任务时,会有以下行为的变化: 如果SMT对端CPU运行了SMT驱逐者( |
- 在同一层级的cgroup中的任务,身份标识的优先级生效。
- 相对于父层级的cgroup,任务身份标识的优先级不生效;相对于子层级的cgroup,任务身份标识的优先级生效。
- 同优先级的身份标识之间的资源竞争基本服从CFS调度器的策略,但需要注意
ID_UNDERCLASS
、ID_NORMAL
身份标识的任务没有最小运行时间的保障。
身份标识 | 说明 |
---|---|
ID_SMT_EXPELLER | SMT驱逐者,当其被调度到CPU上运行时,驱逐SMT对端CPU上的ID_UNDERCLASS 身份标识的任务。 |
ID_IDLE_SEEKER | 表示当任务被唤醒时,会在调度器策略范围内最大限度的尝试找到空闲CPU(Idle CPU)。 |
ID_IDLE_SAVER | 与内核参数sched_idle_saver_wmark 结合使用,您可以通过sched_idle_saver_wmark 自行配置空闲时长水位线。当ID_IDLE_SAVER 身份标识的任务被唤醒时,只会尝试找到高于该水位线的空闲CPU,不会尝试找到低于该水位线的空闲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。
- 调度特性开关配置接口运行以下命令,您可以通过
sched_features
接口查看到内核调度特性的默认配置。
具体说明如下: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
:表示特性为启用状态。 - 该特性开启时允许
- 用于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
从 kernel-4.19.91-26.4
开始,Group Identiy新增开关/proc/sys/kernel/sched_group_identity_enabled
。使用Group Identity之前需要先执行echo 1 > /proc/sys/kernel/sched_group_identity_enabled
打开该开关,否则将无法使用Group Identiy功能。开启该开关后,如果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
信息输出说明
cat /proc/sched_debug
输出的参数说明如下:参数 | 说明 |
---|---|
nr_high_running | 当前CPU上运行的ID_HIGHCLASS 任务数量。 |
nr_under_running | 当前CPU上运行的ID_UNDERCLASS 任务数量。 |
nr_expel_immune | 当前CPU上运行的非ID_UNDERCLASS 任务数量。 |
smt_expeller | 当前CPU是否有ID_SMT_EXPELLER 任务在运行。参数值为1表示有;参数值为0表示无。 |
on_expel | SMT调度器的对端是否有ID_SMT_EXPELLER 任务在运行。参数值为1表示有;参数值为0表示无。 |
high_exec_sum | 当前CPU上ID_HIGHCLASS 任务的累计运行时间。 |
under_exec_sum | 当前CPU上ID_UNDERCLASS 任务的累计运行时间。 |
h_nr_expel_immune | 当前cfs_rq 上运行的非ID_UNDERCLASS 任务数量。 |
expel_start | CPU在驱逐任务的开始阶段,两个红黑树结构的最小虚拟运行时间的差距。 |
expel_spread | 由于CPU驱逐状态造成的两个红黑树结构最小虚拟运行时间的累计差距。 |
min_under_vruntime | 低优先级红黑树结构的最小虚拟运行时间。 |
相关问题
问题:如何将内核版本从kernel-4.19.91-25.1.al7
~kernel-4.19.91-25.5.al7
升级至kernel-4.19.91-25.6.al7
或更高版本?
- 远程登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,查询内核版本。
uname -r
- 运行以下命令,升级内核版本。
yum update kernel
- 运行以下命令,重启ECS实例至新的内核版本。
reboot