《KVM实战:原理、进阶与性能调优》学习笔记
虚拟化的定义
虚拟化是一种资源管理技术,它将计算机的各种实体资源(CPU、内存、存储、网络等)予以抽象和转化出来,并提供分割、重新组合,以达到最大化利用物理资源的目的。
为了达到虚拟化,需要引入一个层:VMM(Virtual Machine Monitor)虚拟机监控器,也称为Hypervisor层。它向下掌控实际的物理资源(相当于原本的操作系统);向上呈现给虚拟机N份逻辑的资源。
虚拟化技术的实现方式
主要有软件虚拟化和硬件虚拟化两种。
软件虚拟化,顾名思义,就是通过软件模拟来实现VMM层,通过纯软件的环境来模拟执行客户机里的指令。最纯粹的软件虚拟化实现当属QEMU。
硬件虚拟化技术就是指计算机硬件本身提供能力让客户机指令独立执行,而不需要(严格来说是不完全需要)VMM截获重定向。Intel从2005年就开始在其x86 CPU中加入硬件虚拟化的支持——IntelVirtualization Technology,简称Intel VT。
半虚拟化和全虚拟化
让客户机意识到自己是运行在虚拟化环境里,并做相应修改以配合VMM,这就是半虚拟化(Para-Virtualization)。一方面,可以提升性能和简化VMM软件复杂度;另一方面,也不需要太依赖硬件虚拟化的支持。
与半虚拟化相反的,对于全虚拟化(Full Virtualization),客户机操作系统完全不需要改动,所有软件都能在虚拟机中运行。因此,全虚拟化需要模拟出完整的、和物理平台一模一样的平台给客户机,这在达到了第一个目标的同时也增加了虚拟化层(VMM)的复杂度。
Type1和Type2虚拟化
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为Typel和Type2。
Type1(类型1)Hypervisor也叫native或bare-metal Hypervisor。这类虚拟化层直接运行在硬件之上,没有所谓的宿主机操作系统。它们直接控制硬件资源以及客户机。典型地如Xen和VMware ESX。
Type2(类型2)Hypervisor运行在一个宿主机操作系统之上,如VMwareWorkstation;或系统里,如KVM。这类Hypervisor通常就是宿主机操作系统的一个应用程序,像其他应用程序一样受宿主机操作系统的管理。
KVM简介
KVM全称是Kernel-based Virtual Machine,即基于内核的虚拟机,是采用硬件虚拟化技术的全虚拟化解决方案。
它以内核模块的形式加载之后,就将Linux内核变成了一个Hypervisor,但硬件管理等还是通过Linuxkernel来完成的,所以它是一个典型的Type 2 Hypervisor。
一个KVM客户机对应于一个Linux进程,每个vCPU则是这个进程下的一个线程,还有单独的处理IO的线程,也在一个线程组内。
KVM的功能特性
1.内存管理
一个KVM客户机就是一个普通的Linux进程,所以,客户机的“物理内存”就是宿主机内核管理的普通进程的虚拟内存。
2.存储和客户机镜像的格式
严格来说,这是QEMU的功能特性。KVM能够使用Linux支持的任何存储来存储虚拟机镜像,包括具有IDE、SCSI和SATA的本地磁盘,网络附加存储(NAS)(包括NFS和SAMBA/CIFS),或者支持iSCSI和光线通道的SAN。
3.实时迁移
KVM支持实时迁移,这提供了在宿主机之间转移正在运行的客户机而不中断服务的能力,实时迁移对用户是透明的。
4.设备驱动程序
KVM支持混合虚拟化,其中半虚拟化的驱动程序安装在客户机操作系统中,允许虚拟机使用优化的I/O接口而不使用模拟的设备,从而为网络和块设备提供高性能的I/O。
5.性能和可伸缩性
KVM继承了Linux的性能和可伸缩性。KVM在CPU、内存、网络、磁盘等虚拟化性能上表现出色,大多都在原生系统的95%以上。KVM的伸缩性也非常好,支持拥有多达288个vCPU和4TB RAM的客户机,对于宿主机上可以同时运行的客户机数量,软件上无上限。
KVM的现状
得益于与Linux天然一体以及Redhat的倾力打造,KVM已经成为Openstack用户选择的最主流的Hypervisor(因为KVM是Openstack的默认Hypervisor)。来自Openstack的调查显示,KVM占到87%以上的部署份额,并且(笔者认为)还会继续增大。可以说,KVM已经主宰了公有云部署的Hypervisor市场。
KVM的展望
(1)大规模部署尚有挑战。(2)实时性(Realtime)。(3)安全是永恒的主题/话题。(4)性能调优。
KVM架构概述
硬件虚拟化技术包括对CPU、内存、I/O等硬件的虚拟化,KVM就是在硬件辅助虚拟化技术之上构建起来的虚拟机监控器。当然,并非要所有这些硬件虚拟化都支持才能运行KVM虚拟化,KVM对硬件最低的依赖是CPU的硬件虚拟化支持,而其他的内存和I/O的硬件虚拟化支持,会让整个KVM虚拟化下的性能得到更多的提升。
KVM虚拟化的核心主要由以下两个模块组成:
1)KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存器的访问、vCPU的执行。
2)QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、PCI/PCIE总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过ioctl系统调用与内核态的KVM模块进行交互。
在KVM虚拟化架构下,每个客户机就是一个QEMU进程,在一个宿主机上有多少个虚拟机就会有多少个QEMU进程;客户机中的每一个虚拟CPU对应QEMU进程中的一个执行线程;一个宿主机中只有一个KVM内核模块,所有客户机都与这个内核模块进行交互。
![](https://img2020.cnblogs.com/blog/1944802/202109/1944802-20210924144349114-1069026935.png)
KVM内核模块
KVM内核模块是标准Linux内核的一部分,由于KVM的存在让Linux本身就变成了一个Hypervisor,可以原生地支持虚拟化功能。
KVM内核模块由两部分组成:
-
一个是处理器架构无关的部分,用lsmod命令中可以看到,叫作kvm模块;
-
另一个是处理器架构相关的部分,在Intel平台上就是kvm_intel这个内核模块。
KVM的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
最后,KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令。接下来,虚拟机的创建和运行将是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。
/dev/kvm这个设备可以被当作一个标准的字符设备,KVM模块与用户空间QEMU的通信接口主要是一系列针对这个特殊设备文件的loctl调用。
针对/dev/kvm文件的最重要的loctl调用就是“创建虚拟机”;针对虚拟处理器的最重要的loctl调用就是“执行虚拟处理器”。
一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块来直接负责,比如虚拟中断控制器和虚拟时钟,这样可以大量减少处理器模式切换的开销。而大部分的输入输出设备交给用户态程序QEMU来负责。
QEMU用户态工具
QEMU原本就是一个著名的开源虚拟机软件项目,而不是KVM虚拟化软件的一部分。
与KVM不同,QEMU最初实现的虚拟机是一个纯软件的实现,通过二进制翻译来实现虚拟化客户机中的CPU指令模拟,所以性能比较低。但是,其优点是跨平台。
作为一个存在已久的虚拟机监控器软件,QEMU的代码中有完整的虚拟机实现,包括处理器虚拟化、内存虚拟化,以及KVM也会用到的虚拟设备模拟(比如网卡、显卡、存储控制器和硬盘等)。
通过与KVM的密切结合,让虚拟化的性能提升得非常高,在真实的企业级虚拟化场景中发挥重要作用,所以我们通常提及KVM虚拟化时就会说“QEMU/KVM”这样的软件栈。
与QEMU/KVM结合的组件
1.vhost-net
vhost-net是Linux内核中的一个模块,它用于替代QEMU中的virtio-net用户态的virtio网络的后端实现。使用vhost-net时,还支持网卡的多队列,整体来说会让网络性能得到较大提高。
2.Open vSwitch
Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache2.0许可协议,主要用可移植性强的C语言编写的。在KVM虚拟化中,要实现软件定义网络(SDN),那么Open vSwitch是一个非常好的开源选择。
3.DPDK
DPDK全称是Data Plane Development Kit。它专注于网络应用中数据包的高性能处理。具体体现在DPDK应用程序是运行在用户空间上,利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。在KVM架构中,为了达到非常高的网络处理能力(特别是小包处理能力),可以选择DPDK与QEMU中的vhost-user结合起来使用。
4.SPDK
SPDK全称是Storage Performance Development Kit,它可为编写高性能、可扩展的、用户模式的存储程序提供一系列工具及开发库。它与DPDK非常类似,其主要特点是:将驱动放到用户态从而实现零拷贝、用轮询模式替代传统的中断模式、在所有的I/O链路上实现无锁设计,这些设计会使其性能比较高。在KVM中需要非常高的存储I/O性能时,可以将QEMU与SPDK结合使用。
5.Ceph
Ceph是Linux上一个著名的分布式存储系统,能够在维护POSIX兼容性的同时加入复制和容错功能。在OpenStack的云平台解决方案中,Ceph是一个非常常用的存储后端。
6.libguestfs
libguestfs是用于访问和修改虚拟机的磁盘镜像的一组工具集合。是管理KVM磁盘镜像的首选工具。
KVM上层管理工具
1.libvirt
libvirt是使用最广泛的对KVM虚拟化进行管理的工具和应用程序接口,已经是事实上的虚拟化接口标准,作为通用的虚拟化API,libvirt不但能管理KVM,还能管理VMware、Hyper-V、Xen、VirtualBox等其他虚拟化方案。
2.virsh
virsh是一个常用的管理KVM虚拟化的命令行工具,对于系统管理员在单个宿主机上进行运维操作,virsh命令行可能是最佳选择。virsh是用C语言编写的一个使用libvirt API的虚拟化管理工具,其源代码也是在libvirt这个开源项目中的。
3.virt-manager
virt-manager是专门针对虚拟机的图形化管理软件,底层与虚拟化交互的部分仍然是调用libvirt API来操作的。在管理的机器数量规模较小时,virt-manager是很好的选择。因其图形化操作的易用性,成为新手入门学习虚拟化操作的首选管理软件。
4.OpenStack
OpenStack是一个开源的基础架构即服务(IaaS)云计算管理平台,可用于构建共有云和私有云服务的基础设施。OpenStack仍然使用libvirt API来完成对底层虚拟化的管理。