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

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.mzph.cn/news/866360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot读取yml配置注意点记录

问题1:yml中配置的值加载到代码后值变了。 现场yml配置如下: type-maps:infos:data_register: 0ns_xzdy: 010000ns_zldy: 020000ns_yl: 030000ns_jzjz: 040000ns_ggglyggfwjz: 050000ns_syffyjz: 060000ns_gyjz: 070000ns_ccywljz: 080000ns_qtjz: 090…

Windows 11 安装 Python 3.11 完整教程

Windows 11 安装 Python 3.11 完整教程 一、安装包安装 1. 下载 Python 3.11 安装包 打开浏览器,访问 Python 官方下载页面。点击“Download Python 3.11”,下载适用于 Windows 的安装包(Windows installer)。 2. 安装 Python 3.11 运行下载的安装包 python-3.11.x-amd6…

路由器的ip地址与网关的区别是什么

在网络世界中,路由器扮演着至关重要的角色,它负责数据的传输和网络的互联。而在路由器的设置中,有两个常见的概念:IP地址和网关。那么,路由器的IP地址与网关的区别是什么?下面与虎观代理小二一起了解一下吧…

Spring Boot中使用SpringEvent组件

Spring的事件机制是基于观察者模式的实现,主要由以下三个部分组成: 事件(Event):事件是应用中发生的重要事情,通常是一个继承自ApplicationEvent的类。 事件发布器(Publisher)&…

go——Swagger使用

一. 为什么后端需要配置Swagger 在前后端分离的项目中,后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。 Swagger是一个用于设计,构建和文档化API的开源框架。在Go语言中,Swagger可以帮助后端开发人员快速创建和定义RESTf…

君子签区块链+AI,驱动组织实现高效合同管理、精准风险控制

在传统合同签署的过程中,企业、组织、机构都面临着合同签署与管理的诸多问题和挑战:合同种类繁多、数量庞大导致起草效率低下;管理流程繁琐、权限分散使得审批周期冗长且效率低下;合同签订版本难以精准复核,风险防控更…

用Vue3和Plotly.js绘制交互式3D烛形图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 Plotly.js实现交互式K线图 应用场景 K线图广泛应用于金融领域,用于展示股票、外汇等金融产品的价格走势。它直观地呈现了开盘价、收盘价、最高价和最低价等信息,帮助投资者分析市场趋势…

克隆gitee仓库,在vs2022创建文件夹开发项目操作步骤

git网站 git知识大全 git教程:廖雪峰的官方网站 git菜鸟教程 gitee之创建项目步骤 同步源仓库 2. 克隆命令 3. 右击git Bash Here>粘贴命令行 4. 选中项目文件夹》创建本人文件夹(ZYY) 5. 打开vs2022》新建项目》选择Framework》下…

第二届计算机、视觉与智能技术国际会议(ICCVIT 2024)

随着科技的飞速发展,计算机、视觉与智能技术已成为推动现代社会进步的重要力量。为了汇聚全球顶尖专家学者,共同探讨这一领域的最新研究成果和前沿技术,第二届计算机、视觉与智能技术国际会议(ICCVIT 2024)将于2024年1…

【Unity navmeshaggent 组件】

【Unity navmeshaggent 组件】 组件概述: NavMeshAgent是Unity AI系统中的一个组件,它允许游戏对象(通常是一个角色或AI)在导航网格(NavMesh)上自动寻路。 组件属性: Radius:导航…

springboot课堂考勤系统-计算机毕业设计源码94408

目 录 1 绪论 1.1 选题背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 课堂考勤系统系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统流程分析 2.…

免费的鼠标连点器哪个好用?5款2024年最新鼠标连点器分享

鼠标连点器是电脑网络游戏爱好者并不陌生的游戏辅助工具,他在FPS、RTS、moba等游戏种类中发挥着重要作用。可以帮助玩家的鼠标完成各种简单点击动作。轻松实现游戏刷机升级。让你游戏升级不再“肝”,轻松刷图升级,秒表大佬不是梦!…

使用getline()从文件中读取一行字符串

我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时,该方法的功能就变成了从指定文件…

电传动无杆飞机牵引车交付用户

自2019年起,我们计划做电传动控制,先后做了电传动水泥搅拌罐车罐体控制(国内首创),初步理解了电机控制的特点。 20-21年接着做了10t飞机牵引车控制,还是电液控制联合的,把越野叉车的行驶控制方…

Blender渲染慢?那是你还不知道这5个技巧

Blender是一款功能强大且用途广泛的软件,可帮助 3D 艺术家和动画师创作出色的视觉内容。如果您使用过 Blender,您就会知道渲染可能非常耗时。渲染时间过长可能会令人烦恼并限制创造力。 在这篇文章中,我们将提供一些专家提示和想法以加快 Bl…

一文搞懂MySsql的Buffer Pool

Buffer Pool是什么 Buffer Pool是MySQL数据库中一个非常关键的组件。数据库中的数据最终都是存放在磁盘文件上的。但是在对数据库执行增删改查操作时,不可能直接更新磁盘上的数据。因为如果直接对磁盘进行随机读写操作,那速度是相当的慢的。随便一个大磁…

软考(高项)系统分析师--论文写作技巧

文章目录 前言一、论文的结构和要求:1.1 论文的结构:1.2 论文的要求: 二、论文每段的写法:2.1 解题:2.2 摘要:2.2.1 第一段:2.2.2 第二段: 2.3 正文:2.3.1 项目背景&…

TikTok美区日销二十万美金爆款黑马!胸贴赛道成功起飞!

从去年开始,一项名为“No bra”(无胸罩)的挑战就长期刷屏TikTok。随着平台内各大博主和明星站台发声,越来越多用户也参与其中,话题的热度逐渐走向高潮。截止到目前, TikTok上相关话题累计播放量已高达8.3亿…

django admin添加自己的页面

建立模型 如果要单独建一个页面,用于展示model的数据,可以新建一个model,继承自要展示的那个类 class ViewsByDayModel(ViewsByDay): # 父类为要展示的model类class Meta:proxy True # 使用代理verbose_name 每日浏览次数统计verbose_nam…

仿Antd-mobile的Cascader实现省市区联动

为啥不直接用Cascader 级联选择组件呢?主要是因为作为老项目,已经引入了antd-mobile2.3.4,同时引入v5版本会有兼容性问题。 原始数据格式: 首先需要将后端返回的数据转为前端定义的格式,方便使用: [{&qu…