openEuler AArch64 架构 vCPU 热插拔技术内幕

news/2024/7/7 19:58:30 标签: 架构, linux, 运维, 服务器, openEuler

OpenAtom openEuler(简称"openEuler")社区引领技术浪潮,早在openEuler 20.09 创新版本就率先使能并对外开放了 AArch64 架构 vCPU 热插特性。时隔四年,openEuler 24.03 LTS 版本补充了 vCPU 热拔能力,vCPU 热插拔特性得到正式完整的支持,其更好地满足开发者对 vCPU 资源的弹性伸缩需求,进一步延伸了该特性的使用场景及价值。本文将带各位读者更深入了解 vCPU 热插拔技术的价值、AArch64 架构下 vCPU 热插拔特性演进历史及基本实现原理。

特性价值

vCPU 热插拔技术可以在虚拟机运行状态下增加或减少 vCPU 数量,实现不中断业务条件下动态调整vCPU 资源。资源弹性是云计算的核心优势之一,而 vCPU 热插拔是实现 CPU 算力弹性的关键技术之一。其价值不限于:1)加快虚拟机启动速度。特别对于轻量化场景收益较大。比如 Kata 安全容器初始只配置 1个 vCPU,等启动完成后热插更多 vCPU。2)按需使用资源,从而优化业务成本。开发者根据业务负载需求,在线调整虚拟机 vCPU 数量。负载大时增加资源,负载小时减少资源。

来自 AArch64 架构的挑战

在 AArch64 架构下,支持 vCPU 热插拔面临来自架构规范、Guest 内核、KVM 各方面的挑战。AArch64 体系结构缺乏对物理 CPU 热插拔的设计,使得虚拟化场景 CPU 热插拔的设计缺乏现实物理世界的依据。特别是中断控制器 GIC,其默认所有 CPU 在启动时都已存在,不能在系统启动后进行调整。由于物理系统不支持 CPU 热插拔,ARM Linux 内核也一直缺乏对该能力的支持。如果要在虚拟化场景实现该特性,必须先完善 Linux 内核,使得当其作为 Guest 内核时能正常支持该特性。另外还面临着来自 KVM 的挑战。KVM 不支持动态调整 vCPU 对象数量,即当虚拟机开始运行后,KVM 将拒绝操作目标虚拟机增加或减少 vCPU。

特性演进
面对以上挑战,虚拟化场景下 CPU 热插拔特性的进度较缓慢。最早的实现来自华为,于 2019 年和 2020 年分别向主线社区提交了 Guest 内核侧补丁[1]及 QEMU 侧补丁[2],热插拔协议上参考了 x86 架构。但社区讨论认为 AArch64 架构暂时缺乏 CPU 热插拔相关规范,相关补丁不能先于规范合入主线。此后华为和 ARM 公司深入合作,经过长期的努力,基本解决了不限于以上所述的挑战。2022 年,ACPI 6.5 规范发布,针对 AArch64 特殊的架构限制,在 MADT GICC 描述中加入了 ONLINE-CAPABLE 属性[3],用于支持虚拟化场景下 CPU 热插拔。基于该最新规范,ARM 公司开发了 Guest 内核侧补丁[4],华为开发了 QEMU 侧补丁[5]。相关补丁正在稳步推进,即将合入主线社区。openEuler 社区完善并加固了以上补丁,在 openEuler 24.03 LTS 版本中提供了对该特性的稳定支持。
基本实现原理
初始化流程:为了应对来自体系结构和 KVM 架构的约束,QEMU 在创建具有热插能力的虚拟机时,必须为所有 vCPU 调用 KVM_CREATE_VCPU IOCTL 创建 KVM vCPU 对象,并为所有 vCPU 提前创建好 GIC irqs、GICR 和 GICC 等虚拟资源。但初始化时只需创建实际需要的 vCPU 线程,对于还未热插的 vCPU,其 vCPU 线程可以延迟到热插时再创建。此外还涉及到两个关键的虚拟设备。CPU Control Device 负责管理整个vCPU热插拔的状态,GED Device 负责向 Guest 发送热插拔通知。Guest 内核通过虚拟 ACPI 表和 CPU Control Device 及GED 设备交互。相关的 ACPI 方法包括_EVT、_STA、_MAT 等。

图片

图1 vCPU 热插流程

热插流程:开发者通过 device_add QMP 命令向 QEMU 发出 vCPU 热插请求。QEMU 解析命令,创建 vCPU 线程使之与初始化时提前创建的 KVM vCPU 对象相关联,然后调用 KVM 初始化vCPU 状态并运行。随后,QEMU 依照 ACPI 规范,修改当前热插 vCPU 的 _STA 状态为 PRESENT 且 ENABLE ,操作 GED 设备发送中断给 Guest。Guest 响应中断,执行 ACPI 表中的 CSCN 方法获取到新插入的 vCPU 信息,最后通知内核 CPU 热插拔模块初始化该 CPU。

图片

图2 vCPU 热拔流程

热拔流程:开发者通过 device_del QMP 命令向 QEMU 发出 vCPU 热拔请求。QEMU 解析QMP 命令,首先标记需要热拔 vCPU 为 removing 状态,然后通过 GED 设备向 Guest 发出中断。Guest 执行 ACPI CSCN 方法了解到需要拔出的 vCPU 编号,通知内核 CPU 热插拔模块清理下线该 CPU。完成之后,Guest 执行 _EJ0 方法通知后端 QEMU 清理 vCPU 资源。QEMU 修改 vCPU 的 _STA 状态为 PRESENT 且 DISABLE。

未来展望
如今资源在线伸缩已经成为了很多行业业务场景的关键需求,vCPU 热插拔特性将支撑 ARM 平台服务器打开更大云数据中心市场。未来 openEuler 社区将持续完善虚拟化技术生态,引领技术创新,打造高性能强安全轻量化虚拟化平台,为各行各业创造更大价值。
参考资料

[1] 2019 年华为公司提交的 AArch64 vCPU 热插拔 Guest 内核侧代码:https://lwn.net/Articles/792409/

[2] 2020 年华为公司提交的 AArch64 vCPU 热插拔 QEMU 侧代码:https://lore.kernel.org/qemu-devel/20200613213629.21984-2-salil.mehta@huawei.com/

[3] ACPI6.5 规范在 GICC flag 中新增“Online Capable”标志位:https://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html#gicc-cpu-interface-flags

[4] 2023 年 ARM 公司提交的 AArch64 vCPU 热插拔 Guest 内核侧代码:https://lore.kernel.org/lkml/20230203135043.409192-1-james.morse@arm.com/

[5] 2023 年华为公司提交的 AArch64 vCPU 热插拔 QEMU 侧代码:https://lore.kernel.org/qemu-devel/20230926100436.28284-1-salil.mehta@huawei.com/


http://www.niftyadmin.cn/n/5535088.html

相关文章

2024年Nano编辑器最新使用教程

Nano在大多数Linux发行版中找到,易于使用,其最常用的命令显示在其屏幕底部。 作为编辑配置和其他文件是Linux中的一种普遍的任务,知道如何使用该程序是否可以非常有用。Nano编辑器以及如何使用Nano编辑器在服务器上编辑文件是我们将在本指南中…

巴图自动化Modbus协议转Profinet协议网关模块连智能仪表与PLC通讯

一、现场要求:PLC作为控制器,仪表设备作为执行设备。执行设备可以实时响应PLC传送的指令,并将数据反馈给PLC,从而实现PLC对仪表设备的控制和监控,实现对生产过程的精确控制。 二、解决方案:通过巴图自动化Modbus协议转Profinet协议…

约瑟夫环-map法

约瑟夫环 1、2、3循环报数&#xff0c;把报数为3的人踢出局&#xff0c;剩下的人仍然循环报数 #include <iostream> #include <map> using namespace std; int main(){map<int,int> b;const int num10;//用map来表示人&#xff0c;键1&#xff08;表示第一…

逻辑这回事(七)---- 器件基础

Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…

kafka的工作原理与常见问题

定义 kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;message queue&#xff09;&#xff0c;主要应用于大数据的实时处理领域 消息队列工作原理 kafka的组成结构 kafka的基础架构主要有broker、生产者、消费者组构成&#xff0c;还包括zookeeper. 生产者负责发送…

centos7安装宝塔面板

一、进入root模式 sudo su二、安装宝塔面板 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec

Spring Boot中获取请求参数的几种方式

前言 在构建现代 Web 应用时&#xff0c;处理来自客户端的请求参数是不可或缺的一部分。Spring Boot作为构建微服务应用的领先框架&#xff0c;提供了多种灵活高效的方式来获取请求参数&#xff0c;满足各种应用场景。 无论您是Spring Boot的初学者&#xff0c;还是希望更深入…

rtpengine_mr12.0 基础建设容器运行

目录 Dockerfile rtpengine.conf 容器内编译安装 RTPEngine 正常提供功能 1. 启动RTPEngine服务 2. 删除 RTPEngine服务 3. 加载内核模块 检查所有进程是否正在运行 上传到仓库 博主wx&#xff1a;yuanlai45_csdn 博主qq&#xff1a;2777137742 后期会创建粉丝群&…