内核cpu cgroup的多级混部调度
需求背景
在业务混部场景中,Linux内核调度器需要为高优先级任务赋予更多的调度机会,并需要把低优先级任务对内核调度带来的影响降到最低。原有的在线、离线两级混部调度无法满足业务需求。
为解决此问题,HCE 2.0内核cpu cgroup支持多级混部调度,提供cgroup接口/sys/fs/cgroup/cpu/cpu.qos_level将任务调度级别扩展到5个级别,支持用户对每个cgroup组单独设置优先级。
约束与限制
内核cpu cgroup的多级混部调度基于5.10.0-60.18.0.50.r692_16.hce2.x86_64内核版本开发,当前cpu.qos_level仅支持cgroup-v1, 不支持cgroup-v2。
多级混部调度接口说明
cpu.qos_level的生效规则:
- CFS调度器自上而下逐层选择task_group,同一个父节点内的子节点之间cpu.qos_level生效。
- 子cgroup创建时默认继承父cgroup的cpu.qos_level,支持重新配置cpu.qos_level值。
- 同优先级的qos_level之间的资源竞争服从CFS调度器的策略。
- 同一个cpu上,qos_level < 0 的任务始终会被qos_level >= 0的任务无条件抢占,不受层级约束。
在调度高优先级任务时:
- 在线任务可无条件抢占离线任务,在多核调度时,在线任务可优先抢占其他核上的离线任务。超线程(Hyper Thread)场景,优先级为2的在线任务可驱逐SMT上的离线任务。
- 高优先级的任务被唤醒时获得一定的时间片加速,可立刻抢占低优先级的任务(忽略CFS的最小运行时间片),获得更好的低时延响应。
接口 |
说明 |
---|---|
cpu.qos_level |
配置cgroup的cpu优先级。取值类型为整数形式,取值范围 为[-2, 2 ] ,默认值为0。 |
接口示例
按如下所示创建3个cgroup节点A、B、C,配置并查看qos_level接口。
cgroup组 |
cpu.qos_level |
---|---|
A |
1 |
B |
-2 |
C |
2 |
- 创建cgroup A及子节点B、C,依次设置A、B、C的cpu调度优先级为1、-2、2。
- 将task1、task2、task3进程加入cgroup B。
- 将task4、task5进程加入cgroup C。
- 查看cgroup B的cpu调度优先级及进程。
[root@localhost cpu_qos]# cat /sys/fs/cgroup/cpu/A/B/cpu.qos_level -2 [root@localhost boot]# cat /sys/fs/cgroup/cpu/A/B/tasks 1879 1880 1881
- 查看cgroup C的cpu调度优先级及进程。
[root@localhost cpu_qos]# cat /sys/fs/cgroup/cpu/A/C/cpu.qos_level 2 [root@localhost boot]# cat /sys/fs/cgroup/cpu/A/C/tasks 1882 1883