ZVM 特性:跨层CFS调度
01 ZVM 调度模型
ZVM调度模型自下而上包括硬件层、虚拟化层和客户OS层三个核心层次,如图1所示。
图1:ZVM虚拟机系统任务调度模型
(1)硬件层
物理CPU(pCPU)根据任务实时性需求划分为实时域和非实时域。其中,非实时pCPU域(pCPU0、pCPU1、pCPU2)用于运行普通虚拟机任务,实时pCPU域(pCPU3)采用独占方式分配给RTOS任务,以保证实时任务的确定性执行。
(2)虚拟化层
ZVM虚拟化层负责vCPU资源管理与调度。在非实时pCPU域上,ZVM维护基于红黑树(RB-Tree)的CFS调度队列;在实时pCPU域上,ZVM采用基于双向链表(dlist)的实时调度队列。本文主要介绍非实时域中的CFS调度机制。
(3)客户系统层
客户OS内部运行自身任务调度器,负责将Task分配至不同vCPU上执行。
02 跨层CFS调度框架
在现有的虚拟机系统中,虚拟机仅能够获取vCPU运行状态,无法获取客户OS内部Task数量、优先级以及负载变化等信息。因此,vCPU调度无法反映客户OS内部任务压力。同时,客户OS仅能够感知自身vCPU资源,无法获取vCPU对应pCPU的实际负载状态,Task调度无法充分利用底层pCPU资源。
ZVM通过共享内存建立客户OS与虚拟化层之间的信息交互通道:
- 上传下(vCPU调度):客户OS将vCPU上的Task信息传给ZVM,ZVM根据vCPU负载状态调整CFS调度权重,并结合pCPU负载信息选择执行核心。
- 下传上(Task调度):ZVM将pCPU负载信息传给客户OS,客户OS根据底层CPU资源状态调整Task迁移策略。
(1)CFS调度器设计
ZVM在虚拟化层引入面向vCPU线程的CFS调度机制,如图2所示。每个客户OS的vCPU对应一个CFS调度实体,该实体维护runtime、vruntime和weight三个核心参数:
图2:ZVM中CFS调度器
- ● runtime:表示vCPU实际消耗的物理CPU运行时间;
- ● vruntime:表示经过权重修正后的虚拟运行时间,是CFS调度排序的核心依据;
- ● weight:表示该vCPU的调度权重,用于控制vruntime的增长速度。
CFS根据vruntime对vCPU调度实体进行排序,优先选择vruntime较小的vCPU执行,vruntime增长速度受weight(权重)影响,遵循权重补偿公式:
weight越大的vCPU,vruntime增长速度越慢,获得的调度机会越多。
(2)客户OS负载感知的vCPU调度(上传下)
ZVM通过共享内存获取客户OS提供的vCPU负载信息,并根据vCPU内部Task状态动态调整CFS红黑树。
1)vCPU动态创建时插入红黑树
如图3所示,当vCPU创建并进入Ready状态后,ZVM初始化对应CFS调度实体,并将vCPU加入红黑树,具体流程如下:
- ①当创建客户OS1时,其vCPU0变为Ready态表示可调度;
- ②ZVM给vCPU0设置一个min_vruntime的值(例如6),并根据vCPU0当前vruntime值,将vCPU0插入CFS红黑树。
图3:vCPU就绪时进入CFS队列
2)vCPU运行时更新红黑树
vCPU运行过程中,客户OS通过共享内存向ZVM传递vCPU负载信息,包括:
- ● nr_run:该vCPU上可运行任务数量;
- ● high:高优先级任务数量;
- ● util:该vCPU利用率。
ZVM根据上述信息计算vCPU调度权重,并更新CFS红黑树。同时,ZVM结合当前pCPU负载状态选择合适的物理CPU执行vCPU,如图4所示。具体流程如下:
- ①客户OS1通过共享内存将vCPU1上Task的负载信息传输给调度器;
- ②ZVM负载感知模块获取当前pCPU利用率;
- ③CFS调度器根据vCPU负载计算weight,并更新vruntime。例如,vCPU1由于负载较高获得更大的weight,其vruntime增长速度低于其他vCPU,其中vCPU0的vruntime由6增长至10,而vCPU1由6增长至9;
- ④ZVM根据pCPU利用率选择负载较低的pCPU2运行vCPU1。
图4:红黑树更新及vCPU分配
(3)pCPU负载感知的Task调度(下传上)
ZVM将底层pCPU资源状态反馈给客户OS,使客户OS任务调度能够结合物理CPU负载状态。
1)pCPU负载信息上传
ZVM周期性统计硬件资源状态,并通过共享内存向客户OS提供以下信息:
- ● whole_load:ZVM整体CPU负载;
- ● pcpu_load[]:每个pCPU当前负载;
- ● vcpu_pcpu[]:vCPU与pCPU映射关系。
图5:pCPU负载信息上传
这些信息描述了不同pCPU之间的资源使用差异以及vCPU对应的物理CPU状态,为客户OS Task迁移提供依据。
2)客户OS的Task迁移
客户OS根据ZVM反馈的pCPU负载信息优化Task迁移策略。任务迁移触发条件包括:
- ● a)某个vCPU进入空闲状态时;
- ● b)周期性负载均衡阶段。
如图6所示,具体流程如下:
- ①ZVM负载感知模块周期性统计所有pCPU利用率;
- ②ZVM通过共享内存向客户OS负载均衡模块反馈pCPU负载信息;
- ③客户OS负载均衡模块根据vCPU对应pCPU负载状态执行Task迁移。
例如:当前vCPU1对应的pCPU2利用率为20%,压力较低,而vCPU0对应的pCPU1利用率为80%,客户OS负载均衡模块则尝试从vCPU0拉取一个可迁移的任务Task3并迁移到vCPU1上执行。
图6:客户OS Task运行时迁移
03 总结
ZVM跨层CFS调度通过客户OS与虚拟化层之间的双向信息交互,实现vCPU调度和Task调度协同。
- 上传下 客户OS将vCPU内部任务数量、优先级等信息反馈给ZVM,ZVM根据vCPU负载状态调整CFS调度权重,使vCPU调度能够反映客户OS内部任务变化。
- 下传上 ZVM将pCPU负载状态反馈给客户OS,客户OS根据底层pCPU资源状态优化Task迁移策略。
通过跨层CFS调度,ZVM实现虚拟化层资源管理与客户OS任务调度协同,提高多OS环境下CPU资源利用效率和任务执行性能。