tratoVirt作为计算产业中面向云数据中心的企业级虚拟化平台,通过一套统一的架构支持虚拟机、容器和Serverless三种场景。它不仅在轻量低噪、软硬协同和Rust语言级安全等方面具备关键技术竞争优势,还预留了接口和设计来支持更多特性,并向着标准虚拟化演进。本文将深入解析StratoVirt中的vCPU拓扑(SMP)配置与实现。
一、CPU拓扑的基本概念
CPU拓扑用来表示CPU在硬件层面的组合方式,它描述CPU的组成关系,并为内核的调度器提供服务,从而提供更好的性能。在StratoVirt中,支持CPU拓扑为后续的CPU热插拔开发打下一个基础。常见的CPU SMP结构是:Socket → Die → Cluster → Core → Thread。
- Socket:处理器插座,用于安装CPU。
- Die:处理器在生产过程中,从晶圆上切割下来的一个个小方块,Die之间的组件通过片内总线互联。
- Cluster:簇,大核或者小核的一种组合。
- Core:表示独立的物理CPU。
- Thread:逻辑CPU,英特尔超线程技术引入的新概念。
二、vCPU拓扑的获取原理
CPU拓扑的获取原理因x86和ARM架构的不同而有所区别。
在x86架构下,操作系统会通过读取CPUID来获取CPU拓扑结构。CPUID指令(由CPUID操作码标识)是处理器补充指令,允许软件发现处理器的细节。程序可以使用CPUID来确定处理器类型。跟CPU拓扑相关的CPUID叶分别是0BH和1FH,1FH是0BH的扩展,可以用来表示更多的层级。Intel建议先检查1FH是否存在,如果1FH存在会优先使用它。
在ARM架构下,如果操作系统是依靠Device Tree启动的,则会通过Device Tree去获取CPU拓扑。如果是以ACPI的方式启动的话,操作系统会通过解析ACPI的PPTT表去获取CPU拓扑结构。PPTT表(Processor Properties Topology Table)用于描述处理器的拓扑结构,还可以描述附加信息,例如处理器拓扑中的哪些节点构成物理包。
三、StratoVirt中vCPU模块的设计与实现
StratoVirt的虚拟化解决方案是一套软硬结合的硬件辅助虚拟化解决方案,其运作依赖于硬件辅助虚拟化的能力(如VT-X或Kunpeng-V)。vCPU模块的实现紧密依赖于这套硬件辅助虚拟化的解决方案。
对于物理机的CPU而言,硬件辅助虚拟化为CPU增加了一种新的模式:Non-Root模式。在该模式下,CPU执行的并不是物理机的指令,而是虚拟机的指令。这种指令执行方式消除了大部分性能开销,非常高效。但是特权指令(如I/O指令)不能通过这种方式执行,还是会强制将CPU退出到普通模式(即ROOT模式)下交给内核KVM模块和用户态StratoVirt去处理,处理完再重新回到Non-Root模式下执行下一条指令。
StratoVirt中的vCPU模块主要围绕着KVM模块中对vCPU的模拟来实现。为了支持KVM模块中对CPU的模拟,CPU子系统主要负责处理退出到普通模式的事件,以及根据在GuestOS内核开始运行前对vCPU寄存器等虚拟硬件状态的初始化。StratoVirt通过第三方库kvm_ioctls来完成和KVM模块的交互,通过匹配vcpu_fd.run()函数的返回值来处理退出到ROOT模式的事件。该函数的返回值是一个名为VcpuExit的枚举,定义了退出到ROOT模式的事件类型,包括I/O的下发、系统关机事件、系统异常事件等。根据事件的类型,vCPU将对不同的事件作出各自的处理。
以上的整个过程都被包含在一个独立的vCPU线程中,用户可以通过对vCPU线程进行绑核等方式让虚拟机的vCPU获取物理机CPU近似百分之百的性能。同时,对vCPU寄存器虚拟硬件状态信息的初始化则是和StratoVirt的另一个模块BootLoader相互结合。在BootLoader中实现了一种根据Linux启动协议快速引导启动Linux内核镜像的方法。在这套启动流程中,BootLoader将主动完成传统BIOS对一些硬件信息的获取,将对应的硬件表保存在虚拟机内存中,同时将提供一定的寄存器设置信息。这些寄存器设置信息将传输给vCPU模块,通过设置vCPU结构中的寄存器值,让虚拟机CPU跳过实模式直接进入保护模式运行,这样Linux内核就能直接从保护模式的入口开始运行。这种方式让StratoVirt的启动流程变得轻量快速。
vCPU模块还有一大职责就是管理vCPU的生命周期,包括new(创建)、realize(使能)、run(运行)、pause(暂停)、resume(恢复)、destroy(销毁)。New和realize的过程就是结构体创建和寄存器初始化的流程,run的过程即是实现KVM中vCPU运作和VCPU_EXIT退出事件处理的流程。另外的三种生命周期的实现则涉及到对线程同步的精密控制。
四、总结
StratoVirt通过其高效的vCPU拓扑(SMP)配置与实现,为用户提供了高性能、灵活且安全的虚拟化解决方案。通过深入解析其CPU拓扑的基本概念、获取原理以及vCPU模块的设计与实现,可以更好地理解和应用StratoVirt,为云数据中心的高效运行提供有力支持。