当前位置: 首页 > news >正文

StratoVirt中vCPU拓扑(SMP)配置与实现的深度解析

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,为云数据中心的高效运行提供有力支持。

http://www.lryc.cn/news/465859.html

相关文章:

  • Xml 相关注解使用
  • 本地时间与时区时间转化(以Helpdesk和BPI Challenge 2012为例)
  • Golang | Leetcode Golang题解之第482题秘钥格式化
  • 代码随想录 -- 贪心 -- 无重叠区间
  • sql server xml
  • WPF中MVVM的应用举例
  • 编程题 7-24 约分最简分式【PAT】
  • 尚硅谷大数据Flink1.17实战教程-笔记04【Flink DataStream API】
  • MySQL常见优化策略
  • gyp ERR stack Error: Command failed: D:\python\python.EXE -c import sys; print
  • 代码随想录day6| 242.有效的字母异位词 、349. 两个数组的交集、 202. 快乐数 、 1. 两数之和
  • 《IDE 巧用法宝:使用技巧全解析与优质插件推荐》
  • 安全见闻---清风
  • Python爬虫:urllib_post请求百度翻译(06)
  • GPIO输入和输出
  • 时序动作定位 | DDG-Net:弱监督时间动作定位的判别驱动图网络(ICCV 2023)
  • mapbox没有token/token失效,地图闪烁后变空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.
  • C#运动控制
  • 监控易监测对象及指标之:Kafka中间件JMX监控指标解读
  • PDF文件为什么不能编辑是?是啥原因导致的,有何解决方法
  • 海螺AI在人类表情刻画中的应用:技术与创新
  • 【Python实战】几种打包python代码的方法!!!
  • (已开源-ECCV2024)BEV检测模型-LabelDistill,使用真值进行知识蒸馏
  • web前端第一次作业
  • CMake 开发者手册
  • Redis入门:在Java程序中高效使用Redis
  • 活着就好20241021
  • 阿里字节技术管理岗位面试要求
  • MySQL !=NULL 与IS NOT NULL
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第十六集(上篇):制作更多地图,更多敌人,更多可交互对象