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

image2
openEuler2024-06-27openEuler

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 等。

image2 、 图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。

image2

图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/


【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。

【Windows迁移】之SQL Server迁移至openEuler

img

futao2023-12-21openEulerWindows迁移

概述

近些年,数量庞大的企业和个人放弃Windows平台选择Linux平台,并且这个数字呈现扩大的趋势。很长的一段时间,Linux是网络服务器的领导者,具有更强的稳定性、可靠性、成本和安全性等,能够在苛刻的工作负载中实现高可用性和高性能,已经更好的用户体验和丰富的工具集,这也是人们选择Linux的重要原因。

2016年,微软重新构建了SQL Server,致力于将大部分依赖特定操作系统的功能划分,以支持更多的平台。该项目帮助更多想要将Windows平台应用服务迁移至Linux平台的用户。本文介绍如何将SQL Server 2019迁到至openEuler,以帮助用户完成Windows平台数据迁移。

在openEuler上安装SQL Server并创建数据库

准备工作

本部分参考https://www.cnblogs.com/linuxjava/p/17456089.html

安装Python2

安装SQL Server 2019需要Python2依赖,而默认yum源中并没有提供Python2,因此需要手动下载和安装。

  1. 使用wget获取Python包:
wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
  1. 安装Python2需要的一些基本库:
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
  1. 如果没有安装tar,请先安装tar:
sudo yum install tar -y
  1. 解压和安装Python2:
# 使用tar命令解压
tar xzf Python-2.7.9.tgz
# 进入解压后的目录中
cd Python-2.7.9
# 生成MakeFile文件
sudo ./configure --prefix=/usr/local
# 安装
sudo make altinstall
  1. 将安装在/usr/local/bin/目录下的Python软链接到/usr/bin/目录下:
sudo ln -s /usr/local/bin/python2.7 /usr/bin/python
sudo ln -s /usr/local/bin/python2.7 /usr/bin/python2

建立so文件软链接

系统中没有liblber-2.4.so.2libldap-2.4.so.2这两个文件,但有liblber.so.2libldap.so.2(即文件名中不含有版本号),可以建立软链接完成替代:

sudo ln -s /usr/lib64/liblber.so.2 /usr/lib64/liblber-2.4.so.2
sudo ln -s /usr/lib64/liblber.so.2 /usr/lib/liblber-2.4.so.2
sudo ln -s /usr/lib64/libldap.so.2 /usr/lib/libldap-2.4.so.2
sudo ln -s /usr/lib64/libldap.so.2 /usr/lib64/libldap-2.4.so.2

安装SQL Server

本部分参考https://learn.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-ver15&tabs=rhel8

安装SQL Server服务

  1. 由于openEuler本身并没有SQL Server源,并且与Red Hat有一定相似性,故而采用Red Hat的存储库作为下载源。下载SQL Server 2019 (15.x) Red Hat存储库配置文件:
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo
  1. 安装SQL Server:
sudo yum install -y mssql-server
  1. 运行mssql-conf setup,按照提示设置 SA 密码并选择版本。选择版本时,Evaluation、Developer和Express版是免费的
sudo /opt/mssql/bin/mssql-conf setup

根据提示完成设置即可。 4. 完成配置后,验证服务是否正在运行:

systemctl status mssql-server
  1. 在防火墙上打开SQL Server端口。默认的SQL Server端口为TCP 1433:
sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload

如果使用的防火墙不是FirewallD,则需要使用其对应的命令。

禁用sa账户

根据官方文档中的建议,在安装后应当禁用sa账户以确保安全性,但本教程中后续将使用sa账户,故而跳过本步骤,在实际使用时可根据安全性需要选择是否禁用sa账户。

步骤参考:https://learn.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-ver15&tabs=rhel8#disable-the-sa-account-as-a-best-practice

安装SQL Server命令行工具

  1. 本步骤需要再次使用Red Hat存储库作为下载源。下载Microsoft Red Hat存储库配置文件:
curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/mssql-release.repo
  1. 如果安装了早期版本的mssql-tools,请删除所有旧的unixODBC包。
sudo yum remove mssql-tools unixODBC-utf16 unixODBC-utf16-devel
  1. 使用unixODBC开发人员包安装mssql-tools18:
sudo yum install -y mssql-tools18 unixODBC-devel
  1. 将 mssql-tools 更新至最新版本:
sudo yum check-update
sudo yum update mssql-tools18
  1. 向bash shell中的PATH环境变量添加/opt/mssql-tools18/bin/: 若要使sqlcmd和bcp能从登录会话的bash shell进行访问,请使用下列命令修改~/.bash_profile文件中的PATH
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile

若要使sqlcmd和bcp能从交互式/非登录会话的bash shell进行访问,请使用下列命令修改~/.bashrc文件中的PATH

echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc

连接数据库

使用SQL Server名称(-S)、用户名(-U)和密码(-P)的相应参数运行sqlcmd:

sqlcmd -S localhost -U sa -P '<YourPassword>'

上述命令中,连接方式是本地连接,服务器名称是localhost,用户名是sa,密码是安装时指定的sa密码。

如果不想显式输入密码,可以省略-P选项以及对应参数,执行命令后将被要求输入密码。

如果在登录时出现SSL证书认证失败错误,可以通过添加-C选项解决。

当出现了sqlcmd的命令提示符1>时,说明连接成功。

例如,下面是一个成功的交互案例:

[spy@localhost ~]$ sqlcmd -S 192.168.137.223 -U sa -C
Password: #此时输入密码,密码不显示
1> #此时已经登录成功,可以输入SQL语句了

上面的案例中,192.168.137.223是本机IP,也可以替换成远程IP,根据实际情况更改。

若要退出sqlcmd,输入exit或quit即可。

将SQL Server数据迁移至openEuler

本部分参考https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-migrate-restore-database?view=sql-server-ver15

请将下面出现的所有YourDB替换为实际数据库名称。

备份数据

在参考的微软官方文档中,主要使用了SQL Server Management Studio (SSMS)并通过图形化交互的方式完成备份文件的创建。由于数据库管理系统的多样性,该方法在使用了其他数据库管理系统或不使用图形化管理系统时难以使用,因此此处不做介绍,如果希望使用该方法,请参阅https://learn.microsoft.com/zh-cn/sql/linux/sql-server-linux-migrate-restore-database?view=sql-server-ver15#create-a-backup-on-windows

此处推荐使用操作较为简单、适用性较广的使用SQL语句的方法:

BACKUP DATABASE [YourDB] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\YourDB.bak'
WITH NOFORMAT, NOINIT, NAME = N'YourDB-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

如果遇到用户权限问题,可以用以下方法解决:

打开Windows服务(按Win+R后输入services.msc或使用其他方法打开),找到对应的数据库实例服务(例如SQL Server (MSSQLSERVER)),右键打开属性,选中登录选项卡,将登录身份改为本地系统账户或为指定账户赋予需要的权限。

生成备份文件后,使用scp等方法将该文件传输到openEuler上。

迁移数据

  1. 进入超级用户模式:
sudo su
  1. 创建新的备份目录:
mkdir -p /var/opt/mssql/backup
  1. 将备份文件移动到该目录:(假设备份文件就在当前目录下,实际使用时更改文件路径或先cd到正确的目录下)
mv YourDB.bak /var/opt/mssql/backup/

移动备份文件的目的是:/var/opt/mssql的子目录属于用户mssql和组mssql。 4. 退出超级用户模式:

exit
  1. 启动sqlcmd:
sqlcmd -S 192.168.137.223 -U sa -C
  1. 登录sqlcmd后,输入下面的SQL语句:
RESTORE DATABASE YourDB
FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
GO

sqlcmd中不可以同时复制和粘贴多行命令。

如果执行成功,应当收到已成功还原数据库的消息。

如果遇到类似下述错误:

File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf'. Use WITH MOVE to identify a valid location for the file.
Msg 5133, Level 16, State 1, Server servername, Line 1
Directory lookup for the file "Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf" failed with the operating system error 2(The system cannot find the file specified.).

在这种情况下,数据库包含辅助文件。 如果未在RESTORE DATABASEMOVE子句中指定这些文件,则还原过程将尝试在与原始服务器相同的路径中创建这些文件。

可以列出备份中包含的所有文件:

RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
GO

应会看到如下所示的列表(仅列出前两列):

LogicalName         PhysicalName                                                                 ..............
----------------------------------------------------------------------------------------------------------------------
YourDB              Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB.mdf          ..............
YourDB_Product      Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf  ..............
YourDB_Customer     Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Customer.ndf ..............
YourDB_log          Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Log.ldf      ..............

可使用此列表为其他文件创建MOVE子句。在本示例中,RESTORE DATABASE为:

RESTORE DATABASE YourDB
FROM DISK = '/var/opt/mssql/backup/YourDB.bak'
WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf',
MOVE 'YourDB_Product' TO '/var/opt/mssql/data/YourDB_Product.ndf',
MOVE 'YourDB_Customer' TO '/var/opt/mssql/data/YourDB_Customer.ndf',
MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'
GO
  1. 列举所有数据库来验证是否还原成功:
SELECT Name FROM sys.Databases
GO
  1. 数据迁移成功 img

文中所述SQL Server迁移方案,由 Porting Platform WinApp SIG 参与。如果您对Windows迁移的相关技术感兴趣,欢迎您的围观和加入。您可以添加小助手微信,加入对应 SIG 微信群。

img


【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。