KVM 虚拟化详解

Posted 智能云计算

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM 虚拟化详解相关的知识,希望对你有一定的参考价值。

目录

1.    KVM 虚拟化架构

1.1 主流虚拟化架构

1.2 KVM虚拟化架构

2 CPU 虚拟化

2.1 pCPU与vCPU

2.2 虚拟化类型对比

2.3 KVM CPU虚拟化

3 内存虚拟化

3.1 EPT与VPID

3.2 透明大页THB

3.3 内存超分Over-commit

4 IO设备虚拟化

4.1 IO设备虚拟化概述

4.2 设备模拟与virtio驱动

4.3 设备直通与设备共享

4.4 其他IO设备特性

--

服务器虚拟化是云计算最核心的技术,而KVM是当前最主流的开源的服务器虚拟化技术。从Linux2.6.20起,KVM作为内核的一个模块 集成到Linux主要发行版本中。从技术架构(代码量、功能特性、调度管理、性能等)、社区活跃度,以及应用广泛度来看,KVM显现出明显优势,已逐渐替换另一开源虚拟化技术Xen。在公有云领域,2017年之后AWS、阿里云、华为云等厂商都逐渐从Xen转向KVM,而Google、腾讯云、百度云等也使用KVM。在私有云领域,目前VMware ESXi是领导者,微软Hyper-V不少应用,随着公有云厂商不断推进专有云/私有云方案,未来KVM应用也会逐渐增加。KVM目前已支持x86、PowerPC、S/390、ARM等平台。本文参考《KVM实战:原理、进阶与性能调优》等材料,简要梳理总结KVM在x86平台的关键技术原理。


1 KVM 虚拟化架构

1.1 主流虚拟化架构

    图1对比了几种主流虚拟化技术架构:ESXi、Xen与KVM,其主要差别在与各组件(CPU、内存、磁盘与网络IO)的虚拟化与调度管理实现组件有所不同。在ESXi中,所有虚拟化功能都在内核实现。Xen内核仅实现CPU与内存虚拟化, IO虚拟化与调度管理由Domain0(主机上启动的第一个管理VM)实现。KVM内核实现CPU与内存虚拟化,QEMU实现IO虚拟化,通过Linux进程调度器实现VM管理。

图1:虚拟化架构对比

1.2    KVM虚拟化架构

如图2,KVM虚拟化有两个核心模块:

1)KVM内核模块:主要包括KVM虚拟化核心模块KVM.ko,以及硬件相关的KVM_intel或KVM_AMD模块;负责CPU与内存虚拟化,包括VM创建,内存分配与管理、vCPU执行模式切换等。

2)QEMU设备模拟:实现IO虚拟化与各设备模拟(磁盘、网卡、显卡、声卡等),通过IOCTL系统调用与KVM内核交互。KVM仅支持基于硬件辅助的虚拟化(如Intel-VT与AMD-V),内核加载时,KVM先初始化内部数据结构,打开CPU控制寄存器CR4里面的虚拟化模式开关,执行VMXON指令将Host OS设置为root模式,并创建的特殊设备文件/dev/kvm等待来自用户空间的命令,然后由KVM内核与QEMU相互配合实现VM的管理。KVM会复用部分Linux内核的能力,如进程管理调度、设备驱动,内存管理等。

​KVM 虚拟化详解

图2:KVM 虚拟化架构


2.   CPU虚拟化

2.1   pCPU与vCPU

如图3,物理服务器上通常配置2个物理pCPU(Socket),每个CPU有多个核(core);开启超线程Hyper-Threading技术后,每个core有2个线程(Thread);在虚拟化环境中一个Thread对应一个vCPU。在KVM中每一个VM就是一个用户空间的QEMU进程;分配给Guest的vCPU是该进程派生的一个线程Thread,由Linux内核动态调度到基于时分复用的物理pCPU上运行。KVM支持设置CPU亲和性,将vCPU绑定到特定物理pCPU,如通过libvirt驱动定义从NUMA节点为Guest分配vCPU与内存。KVM支持vCPU超分(over-commit)使分配给Guest的vCPU数量超过物理CPU线程总量。

​KVM 虚拟化详解

图3:pCPU与vCPU关系

2.2 虚拟化类型对比

Intel对x86 CPU指定了4种特权级别Ring0- Ring3,其中Ring 0是内核态,运行OS内核,权限最高,可执行特权或敏感指令,对系统资源进行管理与分配等,Ring3权限最低,运行用户应用。如图4,ESXi属于全虚拟化,VMM运行在Ring0完整模拟底层硬件;GuestOS运行在ring1,无需任何修改即可运行,执行特权指令时需要通过VMM进行异常捕获、二进制翻译BT(Binary Translation)和模拟执行。Xen支持全虚拟化(HVM Guest)与半虚拟化(PV Guest)。使用半虚拟化时,GuestOS运行在Ring 0需要进行修改(如安装PV Driver),通过Hypercall调用VMM处理特权指令,无需异常捕获与模拟执行。

KVM是依赖于硬件辅助的全虚拟化(如Inter-VT、AMD-V),目前也通过virtio驱动实现半虚拟化以提升性能。Inter-VT引入新的执行模式:VMM运行在VMX Root模式, GuestOS运行在VMX Non-root模式,执行特权指令时两种模式可以切换。

​KVM 虚拟化详解


图4:x86CPU 特权级别与虚拟化分类

2.3   KVM CPU虚拟化

KVM中vCPU在三种模式下执行:

1)客户模式(Guest Mode)运行GuestOS,执行Guest非IO操作指令。

2)用户模式(User Mode)运行QEMU,实现IO模拟与管理。

3)内核模式(Kernel Mode)运行KVM内核,实现模式的切换(VM Exit/VM Entry),执行特权与敏感指令。

如图5,KVM内核加载时执行VMXON指令进入VMX操作模式,VMM进入VMX Root模式,可执行VMXOFF指令退出。GuestOS执行特权或敏感指令时触发VM Exit,系统挂起GuestOS通过VMCALL调用VMM,切换到Root模式执行,VMExit开销是比较大的。VMM执行完成后,可执行VMLANCH或VMRESUME指令触发VM Entry切换到Non-root模式,系统自动加载GuestOS运行。

VMX定义了VMCS(Virtual Machine Control Structure)数据结构来记录vCPU相关的寄存器内容与控制信息,发生VMExit或VMEntry时需要查询和更新VMCS。VMM为每个vCPU维护一个VMCS,大小不超过4KB,存储在内存中VMCS区域,通过VMCS指针进行管理。VMCS主要包括3部分信息,control data主要保存触发模式切换的事件及原因;Guest state 保存Guest运行时状态,在VM Entry时加载;Host state保存VMM运行时状态,在VM Exit时加载。通过读写VMCS结构对Guest进行控制。

​KVM 虚拟化详解

图5:VMXRoot/Non-Root 模式切换


3.   内存虚拟化

3.1   EPT与VPID

Intel引入了硬件辅助内存虚拟化扩展页表EPT(Extend Page Table),AMD 的是嵌入页表NPT(NestedPage Table),作为CPU内存管理单元MMU的扩展,通过硬件来实现GVA、GPA到HPA的转换。如图6,首先Guest通过CR3寄存器将GVA转换为GPA,然后查询EPT将GPA转换为HPA。EPT的控制权在VMM上,只有CPU工作在Non-Root模式时才参与该内存转换。引入EPT后,Guest读写CR3寄存器或Guest PageFault,执行INVLPG指令等不会触发VM Exit,由此降低了内存转换复杂度,提升转换效率。

​KVM 虚拟化详解

3.2   透明大页THP

3.3   内存超分Over-Commit

由于Guest使用内存时采用瘦分配按需增加的模式,KVM支持内存超分(Over-Commit)使得分配给Guest的内存总量大于实际物理内存总量,从系统访问性能与稳定性考虑,在生产环境中一般不建议使用内存超分。内存超分有三种实现方式:

    1  内存交换(Swapping):当系统内存不够用时,把部分长时间未操作的内存交换到磁盘上配置的Swap分区,等相关程序需要运行时再恢复到内存中。

    2)  气球(Ballooning):通过virtio_balloon驱动实现动态调整Guest与Host的可用内存空间。气球中的内存是Host可使用,Guest不能使用。当Host内存不足时,可以使气球膨胀,从而回收部分已分配给Guest的内存;当Guest内存不足时可以请求压缩气球,从Host申请更多内存使用。

    3)  页共享(Page Sharing):通过KSM(KernelSamepage Merging)让内核扫描正在运行进程的内存。如果发现完全相同的内存页就会合并为单一内存页,并标志为写时复制COW(Copy On Write)。如果有进程尝试修改该内存页,将复制一个新的内存页供其使用。KVM中QEMU通过madvise系统调用告知内核那些内存可以合并,通过配置开关控制是否企业KSM功能。Guest就是QEMU进程,如果多个Guest运行相同OS或应用,且不常更新,使用KSM能大幅提升内存使用效率与性能。当然扫描和对比内存需要消耗CPU资源对性能会有一定影响。


4.     IO设备虚拟化

4.1    IO设备虚拟化概述

虚拟化环境中,Guest的IO操作需要经过特殊处理才能在底层IO设备上执行。如表1,KVM支持5种IO虚拟化技术。

IO虚拟化

类型

优点

不足

设备模拟

全虚拟化

兼容性好,GuestOS 不用修改

IO路径长,VMExit较多,性能较差。

virtio驱动

半虚拟化

减少VM Exit次数,性能较好

Guest需要安装额外驱动,老系统无相关驱动。

设备直通

Pass-through

硬件辅助虚拟化

无需VMM处理,性能很好。

设备独占,PCI设备数量有限,动态迁移受限。

设备共享

SR-IOV

硬件辅助虚拟化

性能很好,设备可共享。

动态迁移有限制。

DPDK/SPDK

硬件辅助虚拟化

用户态处理IO,无需内核参与,性能非常好。

需要对系统进行改造

表1:IO设备虚拟化对比

4.2    设备模拟与virtio驱动

  如图7,全虚拟化的设备模拟与半虚拟化的virtio驱动都是通过软件实现IO虚拟化。

设备模拟

    KVM过QEMU来模拟网卡或磁盘设备。Guest发起IO操作时被KVM的内核捕获,处理后发送到IO共享页并通知QEMU;QEMU获取IO交给硬件模拟代码模拟IO操作,并发送IO请求到底层硬件处理,处理结果返回到IO共享页;然后通知IO捕获代码,读取结果并返回到Guest中。

        Virtio驱动

    在Guest中部署virtio前端驱动,如virtio-net、virtio-blk、virtio_pci、virtio_balloon、virtio_scsi、virtio_console等然后在QEMU中部署对应的后端驱动,前后端之间定义了虚拟环形缓冲区队列virtio-ring,用于保存IO请求与执行信息。Guest的IO从前端驱动发送到virtio-ring,然后后端驱动或去IO并转发到底层设备处理,处理完后返回结果。目前主流的Linux与windows都支持virtio,以获得更好的IO性能。


图7:基于软件的IO虚拟化

vhost-net与vhost-user

virtio中后端驱动由用户空间的QEMU提供,但网络协议栈处于内核中,如果通过内核空间来处理网络IO,可以减少了网络IO处理过程中的多次上下文切换,从而提高网络吞吐量与性能。所以,新的内核中提供vhost-net驱动,使前端网络驱动virtio-net的后端处理任务从用户态的QEMU改到Host内核空间执行。

大规模云计算环境中会使用OVS(OpenvSwitch)或SDN方案,而OVS进程运行在用户态,如果继续用使用内核态的vhost-net,依然存在大量用户态与内核态的切换,所以引入了vhost-user(内核态vhost功能在用户态实现)。vhost-user定义了Master(QEMU进程)和slave(OVS进程)作为通信两端,Master与slave之间控制面通过共享的虚拟队列virtqueure交换控制逻辑,数据面通过共享内存交换信息。结合vhost-user、vSwitch与DPDK可以在用户态完成网络数据包交换处理,从而大幅提升了网络虚拟化性能。

4.3    设备直通与共享

通过软件方式实现IO虚拟化存在一定系统开销与性能损耗,所以Intel 推出硬件辅助虚拟化技术(AMD-V类似)。

硬件虚拟化

说明

VT-x

CPU虚拟化:引入VMX root/non-root模式;

内存虚拟化:引入EPT 与  VPID基础;

VT-d

芯片组虚拟化支持:实现PCI设备直通。通过VFIO实现设备分组、隔离设备间的DMA和中断,平台无关,更好的可移植性。

VT-c

 I/O虚拟化支持:借助虚拟机设备队列VMDq大幅提高IO吞吐率;基于虚拟机直接互连VMDc基于SR-IOV标准使物理网卡虚拟化多个虚拟功能设备VF,实现设备共享分配。

2:Intel 硬件辅助虚拟化技术

设备直通PCI Pass-through

基于硬件辅助虚拟化技术,KVM支持将Host的PCI/PCI-E物理设备(如网卡、磁盘、USB、显卡、GPU等)直接分配给Guest使用。Guest对该设备的IO操作与物理设备一样,不经过QEMU/KVM处理。直通设备不能共享给多个Guest使用,且不能随Guest动态迁移,需要通过热插拔或libvirt工具解决。

设备共享SR-IOV

为了实现多个Guest可以共享同一个物理设备,PCI-SIG发布了SR-IOV(SingleRoot-IO Virtualization)标准,让一个物理设备支持多个虚拟功能接口,可以独立分配给不同的Guest使用。SR-IOV定义了两个功能:

1)  物理功能PF(Physical Function):拥有物理PCI-e设备的完整功能,可独立使用;以及SR-IOV扩展能力,可配置管理VF。

2)  虚拟功能VF(Virtual Function):由PF衍生的轻量级PCI-e功能,包括数据传送的必要资源。不同的VF可以分配给不同的Guest,SR-IOV为Guest独立使用VF提供了独立的内存、中断与DMA流,数据传输过程无需VMM介入。

DPDK/SPDK

为了更好地提升虚拟化网络或磁盘IO性能,Intel等公司推出了数据平面开发工具集DPDK(Data Plance Development Kit)与存储性能开发工具集SPDK(Storage Performace Development Kit)。DPDK、vhost-user、OVS结合使用,可跳过Linux内核,直接在用户态完成网络数据包交换处理。SPDK通过环境抽象层EAL与UIO将存储驱动放在用户态处理,同时通过PMD轮询机制代替传统中断模式来处理IO。DPDK与SPDK大幅缩短了IO处理路径与系统开销,IO性能提升非常明显。DPDK与SPDK详情参考云网络介绍与云存储介绍部分。

4.4    其他IO设备特性

图像与声音

QEMU中对Guest的图像显示默认使用SDL(Simple DirectMedia Layer)实现。SDL是一个基于C语言的、跨平台的,开源的多媒体程序库,提供了简单的接口用于操作硬件平台的图形显示、声音、输入设备等,广泛应用于各种操作系统。同时在虚拟化环境中也广泛使用虚拟网络控制台VNC(Virtual Network Computing),采用RFB(Remote Frame Buffer)协议将客户端(浏览器或VNC Viewer)的键盘与鼠标输入传递到远程服务端VNC Server中,并返回输出结果。VNC不依赖操作系统,在VNC窗口断开后,已发出操作仍然会在服务端继续执行。由于VNC是GPL授权,衍生出多个版本RealVNC、TightVNC与UltraVNC,其对比如表3.

VNC类型

说明

Real VNC

 分为全功能商业版和免费版,免费版的功能特性较少。

TightVNC

通过压缩技术节省传输带宽,对图形显示性能与效果有一定影响,不能复制粘贴。

UltrVNC

 在前两种基础上增强,支持文件传输、消息对话、复制粘贴与快速连接。

3:VNC版本对比

热插拔Hot Plugging

       热插拔就是在服务器运行时插上或拔出硬件,以保障服务器的扩展性与灵活性。热插拔需要总线电气特性、主板Bios、操作系统以及设备驱动的支持。目前支服务器支持硬盘、CPU、内存、网卡、USB设备与风扇等部件热插拔。在KVM中在Guest不关机情况下支持PCI设备(如模拟、半虚拟化或直通的网卡、硬盘、USB设备)。CPU和内存热插拔硬件平台和OS层面的限制还比较多。

---

参考书籍:《KVM实战原理、进阶与性能调优》,任永杰、程舟著。

----------------

相关阅读:


----------------------------------------------------------------------

智能云计算

微信:AIcloud01

介绍:云计算、人工智能、大数据、物联网、云安全、区块链等前沿技术知识与资讯分享平台。

以上是关于KVM 虚拟化详解的主要内容,如果未能解决你的问题,请参考以下文章

KVM虚拟化使用详解--技术流ken

KVM详解

centos7部署KVM虚拟化平台详解

KVM详解

CentOS 7系统KVM虚拟机安装过程详解

kvm使用详解