虚拟化技术作为云计算时代的核心技术,近年来应用越来越广泛。目前,大多数云厂商提供的云主机都是基于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开源社区版本上的优化和增强,接下来天翼云也将积极推进该方案开源到社区,共建开源生态。同时,天翼云弹性计算虚拟化团队还将持续优化方案,下一步将支持直通设备的热升级。
未来,天翼云将继续坚持科技创新,加大关键核心技术自主攻关,推进国产软硬件产品升级,以安全可信、自主可控的新一代云计算基础设施底座,助推中国数字经济高质量发展。