Alibaba Cloud Linux 4(以下简称Alinux 4)基于Linux 6.6 LTS内核将混部调度能力升级为Group Identity 2.0,融合EEVDF、core scheduling与sched_idle语义,在保障在线业务QoS的同时提升整机资源利用率。本文介绍该能力相比Alinux 3的升级内容、整体开启方法以及cgroup详细配置。
整体说明
相比Alibaba Cloud Linux 3已有的Group Identity 1.0混部能力,Alibaba Cloud Linux 4对混部调度做了架构级增强:从基于高低优双红黑树和IPI协调的定制化驱逐机制,升级为融合EEVDF、core scheduling和sched_idle语义的生产级混部调度能力,在保障在线业务QoS的同时提升整机资源利用率。
架构更先进:从Alinux 3的定制化Group Identity机制,升级为和EEVDF、core scheduling、sched_idle深度结合的新内核混部能力。
在线更稳定:CPU竞争和SMT干扰场景下都有更明确的保护路径,降低尾延迟和抖动。
混部更可控:保留存量兼容与运维开关,同时增强灰度、观测和回退能力,适合生产分阶段上线。
升级内容
下表从调度队列模型、驱逐隔离机制、抢占语义、低优任务腾挪和生产可控性五个方面,说明Alinux 4混部调度相比Alinux 3的升级点及价值。
技术领域 | Alinux 3能力 | Alinux 4能力(升级) | 价值 |
调度队列模型 | 基于高低优双红黑树区分在线/离线任务,支持per-cgroup identity与BVT兼容配置。 | 融入EEVDF调度模型,在统一的公平调度框架下处理业务分级和低优任务让渡。 | 调度行为更贴近新内核主线机制,公平性、可维护性和长期演进能力更好。 |
驱逐隔离机制 | 高优任务触发时,通过expel判断和reschedule IPI协调SMT兄弟核上的低优任务让出CPU。 | 基于core scheduling cookie建模expeller/expellee,并结合pick路径的expel判断,面向SMT同核竞争做更精细的隔离。 | 降低离线任务对在线任务的超线程干扰,在线业务尾延迟更稳。 |
抢占语义 | 通过high/underclass、absolute expel、idle seeker/idle saver等定制策略实现优先级压制。 | 结合cpu.priority三态分级;低优业务复用sched_idle语义,在资源紧张时自然让路、资源空闲时继续运行。 | 业务优先级表达更清晰,在线保护和离线资源利用之间更容易平衡。 |
低优任务腾挪 | 已支持expellee迁移、rescue、ID_LOAD_BALANCE、ID_BOOK_CPU等能力,避免低优任务长期被压制。 | 在新调度框架下继续增强低优任务push/rescue/fallback行为,减少无效迁移和驱逐后的长期饿死。 | 高峰期快速保障在线业务,低峰期继续吃满空闲CPU,提升混部收益。 |
生产可控性 | 提供sysctl开关、force disable、fast path、stop_machine切换及多项计数/vruntime修正。 | 延续兼容接口并增强统计、调优和边界修复能力,支持更稳妥的灰度上线。 | 便于分阶段启用、观测效果和快速回退,降低生产落地风险。 |
使用方法
整体功能开启
为避免内核版本分叉,混部能力采用编译时代码合入、运行时动态开启的策略。下表列出各功能项的默认状态、操作方式及验证方法。
模块 | 功能项 | 默认状态 | 用户是否需要操作 | 操作方式 | 说明/验证方法 |
编译配置 |
| x86:on;其他架构:off | 不需要操作 | 编译时开启。 | 控制整体功能是否集成。 |
调度抢占策略 |
| off | 需要打开 | 开启: 关闭: | 验证: |
SMT压制策略 |
| off | 需要打开 | 开启: 关闭: | expeller高优先级任务会抑制相同核里不同SMT上的低优先级任务,避免对expeller造成超线程执行单元竞争。 |
| on | 建议关闭 | 开启: 关闭: | 允许expeller共享SMT。混部场景需要尽量打散运行,建议关闭。 | |
| off | 建议打开 | 开启: 关闭: | 低优任务忽略热缓存,迁移时不考虑cache热度。 | |
| off | 建议打开 | 开启: 关闭: | 低优任务忽略CPU负载,迁移时不考虑CPU上任务数量。 | |
| off | 建议打开 | 开启: 关闭: | 低优任务被SMT驱逐后,主动push到其它CPU,减少对本Core上expeller的持续影响。 | |
| off | 建议打开 | 开启: 关闭: | 有高优先级任务时,完全不让低优先级任务运行。 | |
负载均衡策略 |
| off | 建议打开 | 开启: 关闭: | 对高优先级任务进行专门的load balance,避免高优先级任务在局部CPU上堆积导致的CPU调度延迟。 |
Cgroup详细配置
高优先级抢占
通过cpu.priority接口配置任务的抢占能力,取值含义如下表。
接口 | 可配置数值 | 含义 | 备注 |
| 1 | 高优先级任务 | 会同步设置 |
0 | 普通任务 | 会同步设置 | |
-1 | 低优先级任务 | 会同步设置 |
不可配置根组Cgroup。
配置只接受
1、-1、0三种数值,其它数值不接受。建议通过
cpu.identity统一优先级语义,不建议单独设置cpu.idle。各层级Cgroup可单独配置,但在共同祖先下比较。例如根节点从上到下有两条路径A->B与A->C->D,那么B和D竞争时,由于A是最低的共同祖先,实际由B和C进行竞争(C代表D)。
cgroup.idle的shares默认值为3,如需更改,需要执行sysctl -w sysctl_sched_idle_shares_relax=1打开。
SMT驱逐
通过cpu.identity接口配置任务的SMT驱逐能力,取值含义如下表。
接口 | 可配置数值 | 含义 | 备注 |
| 1 | 高优先级任务expeller | 会驱逐SMT对端identity为-1的任务。 |
0 | 普通任务 | ||
-1 | 低优先级任务 | 会被SMT对端identity为1的任务驱逐。 |
底层实现是为两种identity任务创建两种不同的cookie。如果需要高优任务对低优任务的SMT持续驱逐,需要打开
ID_SMT_EXPEL。在这种情况下,建议同时打开ID_RESCUE_EXPELLEE和ID_PUSH_EXPELLEE,以避免低优先级任务饿死。高优任务如果对SMT干扰特别敏感,为尽可能减少高优先级任务之间的SMT干扰,可以设置
NO_ID_EXPELLER_SHARE_CORE。不可配置根组Cgroup。
配置只接受
1、-1、0三种数值,其它数值不接受。只对当前cgroup的任务生效。当多层cgroup的identity值一样时,不受cgroup祖先控制,也不对cgroup后代产生影响。建议只在叶子结点设置,避免歧义。
创建子cgroup时,子cgroup会继承父cgroup的identity。
接口变化
相比5.10内核,cpu.identity(整体)接口语义已变化,拆分为cpu.priority(抢占能力)和cpu.identity(SMT驱逐能力);cpu.bvt_warp_ns接口保持兼容。
任务类型 | cpu.priority(抢占能力) | cpu.identity(SMT驱逐能力) | 对比5.10 Group Identity 1.0配置映射关系 | 配置建议说明 |
高优先级任务 |
|
|
| 具备抢占能力,且具备对SMT低优任务的驱逐能力。 |
优先任务 |
|
|
| 具备强抢占能力。 |
普通任务 |
|
|
| 使用默认配置,不参与特殊调度策略。 |
低优先级任务 |
|
|
| 降低抢占能力,同时允许被SMT驱逐,适用于后台或低敏感任务。 |
注意事项
历史上在5.10内核上开发了Group Identity 1.0版本,目前在6.6内核上开发Group Identity 2.0版本。可通过以下命令区分:
cat /sys/kernel/group_identity/abi如果/sys/kernel/group_identity/abi文件存在且读取后返回数字2,表示支持Group Identity 2.0,否则不支持。5.10内核里没有该文件。