写点什么

这波无感升级有点秀——天翼云 QEMU 组件热升级方案来了

  • 2022-12-20
    北京
  • 本文字数:3054 字

    阅读完需:约 10 分钟

虚拟化技术作为云计算时代的核心技术,近年来应用越来越广泛。目前,大多数云厂商提供的云主机都是基于 KVM/QEMU 虚拟化技术实现的。而随着虚拟化技术的发展,QEMU 组件也在不断引入新功能并进行功能优化和问题修复。


在公有云场景中,如何在不影响存量虚拟机业务的情况下快速解决资源池中 QEMU 组件的 BUG 或升级 QEMU 版本,是云厂商不得不面对的问题。

目前,业界通常采用的解决方式有两种:

▍通过热补丁方式在线修复 QEMU BUG;

▍使用热迁移技术将虚拟机迁移到安装了新版本 QEMU 的宿主机上。

这两种方式都因底层技术特点导致实施起来难度很大,且对运维团队和云管系统要求更高。


为解决上述问题,天翼云弹性计算虚拟化团队在深入研究了现有虚拟化技术和实际业务场景后,打造了 QEMU 热升级方案,可以快速地在线升级 QEMU 组件,实现在线修复 BUG 和升级业务版本。基于该方案云管系统或管理工具可以非常方便地实现一键升级云主机功能,极大提高整个宿主机上云主机的升级效率。


技术路线

热补丁技术

热补丁技术通常用来在线修复用户态程序中和安全相关的严重 BUG。对于 QEMU 组件,一般使用 libcare 工具制作热补丁,然后再将热补丁应用在虚拟机的 QEMU 进程中,以达到在线修复 BUG 的目的。


但是,热补丁技术只对特别简单的 BUG 有效,对于涉及代码改动较多的 BUG,可能无法通过 libcare 制作出热补丁,即便制作出热补丁后也可能无法成功打上。此外,不同 BUG 的热补丁及其针对不同 QEMU 版本的维护,将随着资源池规模的变大以及 BUG 数量的增多,变得越来越困难,维护成本也越来越高。


热迁移技术

对于需要升级 QEMU 版本的场景,通常可以使用虚拟机热迁移技术将所有虚拟机从原来的宿主机在线迁移到升级后的宿主机上。由于虚拟机在迁移过程中仍然正常运行,使用这种方式升级 QEMU 对于一般用户来说基本上没影响,实现用户业务无感知,因此被很多云厂商采纳使用。


不过,由于是跨主机迁移虚拟机,如果虚拟机内存规格比较大或涉及内存密集型业务,那么迁移一个虚拟机的时间也会比较长。而升级资源池中的 QEMU 版本需要迁移所有虚拟机,可想而知,整个升级周期将持续很长时间,甚至以月为单位。


不仅如此,虚拟机迁移过程将占用大量的网络资源,迁移期间可能对宿主机和虚拟机的网络业务造成较大影响。最后迁移资源池所有虚拟机需要进行资源的统一调度和管理,这对资源调度系统提出了更高要求。


QEMU 热升级方案

在介绍 QEMU 热升级方案之前,一起先了解一下虚拟机热迁移技术背后的原理。


迁移虚拟机时,首先需要使用与源虚拟机相同配置的命令行参数,在目的宿主机上启动一个目的虚拟机进程。然后,再通过多次迭代的形式,将源虚拟机的内存数据通过网络迁移到目的虚拟机的内存中。当剩余内存脏页总量足够小时,立即暂停虚拟机,并将剩余内存以及设备状态数据一次性迁移到目的虚拟机中。最后运行目的虚拟机,同时删除源虚拟机。


从热迁移技术原理可以看出,只要将源虚拟机的内存和设备状态数据迁移到目的虚拟机中,就能保证目的虚拟机和源虚拟机状态一致,而目的虚拟机进程运行在哪个宿主机上并不重要了。


基于热迁移技术原理,QEMU 热升级方案通过在相同宿主机上创建一个使用新版 QEMU 二进制文件启动的目的虚拟机来替换源虚拟机,达到升级 QEMU 版本的目的。和热迁移不一样的是,新创建的目的虚拟机共享源虚拟机的内存,不再需要迁移,只需在替换前将源虚拟机的设备状态迁移到目的虚拟机中即可。QEMU 热升级整体方案流程如图所示。

虚拟机内存共享

在 QEMU 热升级方案中,如何让同一个宿主机上的两个虚拟机进程间共享同一份虚拟机内存成为关键。在此过程中,天翼云基于 memfd 机制实现了虚拟机内存的分配。memfd 机制在 Linux 3.17 版引入,其提供的 memfd_create()接口可以创建一个匿名的文件描述符,且其引用的文件保存在内存中,然后通过 ftruncate()系统调用可以分配指定大小的匿名内存。


该方案修改了 QEMU 进程启动时为虚拟机分配内存的方式,使用 memfd 机制为虚拟机分配内存,并保存对应的 memfd,然后在热升级时将其共享给目的虚拟机进程。


除此之外,为了方便将 memfd 共享给目的进程以及减少代码的修改,该方案通过源虚拟机进程来创建目的虚拟机进程。基于父子进程共享资源的方式,memfd 很自然地就共享给了目的虚拟机进程。目的虚拟机进程启动时不再给虚拟机重新创建内存,而是直接共享使用 memfd 对应的源虚拟机内存。


设备状态迁移

和共享内存一样,创建目的虚拟机进程前,天翼云将源虚拟机的设备状态保存在另一个 memfd 关联的内存中,并将对应的 memfd 共享给目的虚拟机进程。目的虚拟机初始化后,通过读取对应内存中数据即可恢复设备状态。


QEMU 热升级方案的优势

升级时间短,占用网络资源少,业务无感知

新创建的目的虚拟机共享源虚拟机的内存,不再需要迁移,只需要在替换前将源虚拟机的设备状态迁移到目的虚拟机中即可。由于设备状态对应的数据量很小,迁移很快,因此虚拟机在热升级过程中的虚拟机暂停时间很短。


天翼云对比测试了同样场景下热升级和热迁移过程中整体耗时以及虚拟机网络中断时间。从测试结果看,热升级虚拟机的整个过程耗时 1s 左右,网络中断时间大约为 100ms;而热迁移的整个过程耗时 100s~400s,网络中断时间为 300ms。测试结果表明,相比热迁移,热升级的整体耗时减少了 99%,网络中断时间减少了 67%左右。


支持失败回滚功能,不影响虚拟机业务

QEMU 热升级方案支持失败回滚,当升级失败后,可以立即恢复源虚拟机运行,不会影响虚拟机内部业务。由于该方案创建了一个目的虚拟机进程用来替换源虚拟机进程,在升级成功前,源虚拟机只是暂停执行,其所有状态仍然保持原样,因此即便热升级失败后,源虚拟机也可以立即恢复运行。


虚拟机对外接口保持一致,对管理系统透明

虚拟机热升级对上层管理系统(如 OpenStack)透明,升级前后虚拟机对外提供的接口不变, 如 vnc 端口、console 等。天翼云在 QEMU 代码层面做了修改,支持服务端口号、fd 等资源的共享,升级后目的虚拟机直接共享源虚拟机拥有的资源,继续对外提供服务。


网卡设备后端资源共享,无需重新配置网络端口

通常虚拟机在迁移到另外一个宿主机后都需要网络控制器重新配置网络开端口和下发对应的流表,保证网络正常工作。而 QEMU 热升级方案却不需要网络控制器的介入,对其透明,这得益于天翼云对 QEMU virtio 网卡设备的工作机制及代码框架的深入的研究。天翼云在 QEMU 网卡设备代码层面进行了优化,实现了 virtio 网卡设备后端资源共享以及恢复机制,使得目的虚拟机可以共享源虚拟机 virtio 网卡设备的后端资源。


安全保护机制,让热升级更加安全可靠

针对某些场景下(比如设备配置的 socket 使用了 TLS 或 websocket 选项)QEMU 虚拟机无法执行热升级操作的情况,天翼云构建了安全保护机制,通过禁止执行热升级操作,使方案更加安全可靠。在 QEMU 代码中,天翼云相应地增加了热升级 blocker 机制,在虚拟机进程启动时,一旦检查到不支持热升级的场景,将设置一个 blocker,以告知 QEMU 热升级接口禁止执行该操作。由于 blocker 的存在,热升级接口直接报错退出。


一键热升级 QEMU 虚拟机,维护简单

在该方案中,QEMU 只提供了热升级方案所需的所有原子操作接口,通过封装这些接口,libvirt 可以实现一键热升级 QEMU 虚拟机的功能。


持续优化,共建开源生态

天翼云云主机热升级方案是基于 QEMU 开源社区版本上的优化和增强,接下来天翼云也将积极推进该方案开源到社区,共建开源生态。同时,天翼云弹性计算虚拟化团队还将持续优化方案,下一步将支持直通设备的热升级。


未来,天翼云将继续坚持科技创新,加大关键核心技术自主攻关,推进国产软硬件产品升级,以安全可信、自主可控的新一代云计算基础设施底座,助推中国数字经济高质量发展。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
这波无感升级有点秀——天翼云QEMU组件热升级方案来了_云计算_天翼云开发者社区_InfoQ写作社区