计算虚拟化
概述
计算虚拟化是将物理服务器资源通过虚拟化技术抽象成逻辑资源,让一台物理服务器变成多台相互隔离的虚拟服务器,CPU、内存、磁盘、I/O设备等硬件资源变成虚拟化资源池进行统一动态管理,从而提高资源利用率,降低系统管理成本,让IT对业务变化更具适应力。

云平台支持采用基于KVM的硬件虚拟化技术。KVM是一个Linux内核模块,将Linux内核变成一个Hypervisor。KVM在Linux系统内以进程形式出现,由标准Linux调度程序进行调度,因此KVM能够使用Linux内核已有功能,例如:内存管理、CPU调度等。但是,KVM本身仅提供CPU与内存虚拟化,I/O设备虚拟化需要结合Qemu才能完成。Qemu是一个用户态的设备模拟器,为云主机提供虚拟设备模型,负责各种虚拟设备的创建、调用及管理。

技术特性
CPU虚拟化
在x86体系架构上,CPU一般有4个特权级别:ring0~ring3,用于给操作系统和应用程序访问硬件。在Linux中,仅使用其中2个特权级别:ring0(内核态)、ring3(用户态)。
VMX根模式与VMX非根模式。对于硬件辅助虚拟化而言,为能在不对操作系统做任何修改的前提下使用云主机,CPU引入2种运行模式:VMX根模式、VMX非根模式。宿主机运行在根模式下,宿主机内核处于ring0,用户态程序处于ring3。云主机运行在非根模式下,云主机内核处于ring0,用户态程序处于ring3。
VM Exit与VM Entry。处于非根模式的云主机,当外部中断或缺页异常,或主动调用VMCALL指令来调用VMM服务时,CPU会从非根模式切换至根模式,整个过程称为VM Exit。相反,当VMM通过显式调用VMLAUNCH或VMRESUME指令切换至非根模式时,硬件自动加载云主机上下文,运行云主机指令,这一转换称为VM Entry。

当云主机通过VM Exit从非根模式退出至根模式后,KVM会根据退出原因执行进一步操作,若是I/O操作则交由Qemu处理,若是非I/O操作则由KVM自行处理,处理完成后会通过VM Entry再次切回至云主机非根模式下运行。

内存虚拟化
VMM负责管理和分配每个云主机的物理内存。云主机操作系统看到的是一个虚构的云主机物理地址空间,操作系统的内存管理模块负责将云主机虚拟地址(GVA)映射到云主机物理地址(GPA),其指令目标地址也是一个云主机物理地址。这样的地址在无虚拟化情况下,其实是实际物理地址。但在有虚拟化情况下,这样的地址不能被直接处理使用,需VMM先将云主机物理地址转换成一个物理机物理地址(HPA),再交由物理处理器执行。
- 维护云主机物理地址到宿主机物理地址之间的映射关系。
- 当云主机访问云主机物理地址时,根据映射关系,将其转换成宿主机物理地址。

内存的硬件辅助虚拟化使用扩展页表技术,通过硬件完成云主机虚拟地址到物理机物理地址的转换。

设备虚拟化
设备虚拟化方式主要有三种:设备模拟、半虚拟化设备、设备直通。
设备模拟
设备模拟是通过Qemu提供的设备模型,可完全模拟出与物理设备一样的接口。因此,在云主机操作系统中,使用原生驱动即可使用设备。设备模拟只能模拟出具有基本功能的设备,不支持复杂功能和模型的设备。完全模拟的设备兼容性好,但由于是纯软件模拟,性能相对较低。

半虚拟化设备
半虚拟化设备实现前后端驱动。利用云主机中的前端驱动,通过基于事务的通信机制,将请求直接发给宿主机端的后端驱动,从而很大程度上减少上下文切换的开销,性能相比完全设备模拟有较大提升。然而,Virtio后端驱动仍在Qemu中实现,在IO处理过程中会经过用户态与内核态之间的多次切换。为进一步提升性能,可将Virtio后端驱动的功能放至内核态实现,称为vhost-kernel后端,于是数据仅需经过从用户态到内核态的一次切换,就可完成数据传输,实现性能提升。
随着技术发展,将数据放入用户态处理可得到更灵活的形式。因此,在原有vhost架构中进行改动,增加vhost-user后端,搭配DPDK、SPDK中相关用户态函数库,性能进一步提升。

设备直通
设备透传基于硬件的设备虚拟化技术,支持将PCI/PCIe物理设备直接映射到云主机的地址空间,在云主机中,使用原生设备驱动就可直接使用设备,达到近乎物理设备的性能。物理设备被透传后被云主机独享,其它云主机无法共享使用该设备。

SR-IOV是由PCI-SIG组织定义的PCIe规范的扩展规范,目的是通过提供一种标准规范,为云主机提供独立的内存空间、中断、DMA数据流。 SR-IOV支持单个物理PCIe设备(PF)虚拟出多个虚拟PCIe设备(VF),然后通过设备透传技术将虚拟PCIe设备直通到各云主机,以实现单个物理PCIe设备支撑多云主机的应用场景。

