Contents

计算虚拟化

Warning
本文最后更新于 October 21, 2022,文中内容可能已过时,请谨慎使用。

虚拟机怎么做到热迁移提到的两个问题,没想到另一个问题的答案也被我找到了。今天就在计算虚拟化这里回答上篇文章的第一个疑问:

– 我的虚机经常CPU使用率不到 5%,它会不会拿着我的资源去偷偷接济同物理机上的其他高负载业务。

在云计算中的计算虚拟化主要分为了三个部分:1.CPU虚拟化;2.内存虚拟化;3.I/O虚拟化。

CPU 虚拟化

CPU 虚拟化是指在固定的CPU硬件基础上(CPU个数、核数、线程数等),通过虚拟化技术将物理CPU虚拟出多个,能被 Guest OS 识别并能独立的 VCPU

物理CPU虚拟化成虚拟的 VCPU,本质上就是对物理CPU进行资源池化,并根据不同的需求场景来分配不同的计算资源。常用的分配方式对 CPU 做 QOS(Quality of Service,服务质量)


CPU 虚拟化的具体现实

将单个物理CPU虚拟化成多个虚拟CPU供虚拟机使用,虚拟CPU分时复用物理CPU,由虚拟机监控器(Virtual Machine Monitor, VMM)对虚拟机CPU分配时间片,并同时对虚拟CPU的状态进行管理。

CPU 虚拟化有三种实现方式。

  • 基于全虚拟化的CPU虚拟化
  • 基于版虚拟化的CPU虚拟化
  • 基于硬件辅助的CPU虚拟化

这三种CPU虚拟化技术在之前的 这篇文章 中有提到。除了上述之外,还有 CPU 虚拟化的优化技术

  • HT(Hyper-Threading)超线程

在每个单位时间内,CPU只能处理一个线程(Thread)。除非有两个核心处理单元,否则要想在单位时间内处理超过一个的线程是不可能的。超线程HT(Hyper-Threading)技术是在单个核心处理单元中集成两个逻辑处理单元,也就是一个实体内核(共享的运算单元),两个逻辑内核(有各自独立的处理器状态),从而可以在单位时间内模拟双内核运作.可以提高40%的性能。

  • CPU 绑定技术

CPU 绑定技术就是利用CPU 亲和性,把一个或多个进程绑定到一个或多个CPU上,可以在线配置,立即生效,有效解决CPU利用率严重不平均的问题。CPU 热添加技术——动态向运行中的系统添加 CPU,并且可以实现业务不中断。

  • CPU Nested (嵌套)

CPU Nested(嵌套)技术在虚拟机上运行虚拟机;可以将物理CPU特性全部传给虚拟机,理论上可以嵌套N多层。

  • vSMP(虚拟同步多进程)Virtual Symmetric Mutil-Processing

通过此功能实现了多个vCPU协同工作。实现方式是通过多个vCPU通过一个总线访问存储器,也被成为一致内存结构体系(UMA)。在存储器接口达到饱和时,扩展性有限(开启vSMP时,一个VM最多可配置 64 个vCPU)

  • vNUMA(虚拟非统一内存访问)

vNUMA(虚拟非统一内存访问)是一种VMware虚拟机(VM)内存访问优化方式,可以消除内存带宽瓶颈。vNUMA(虚拟非统一内存访问)是一种虚拟机内存访问优化方式,可以消除内存带宽瓶颈。每个vCPU 都有自己的存储器,每个处理器也可以访问别的处理器的存储器。如果一个虚拟机有超过8个vCPU,那么vNUMA就会自动启动。


CPU 的 QOS

  1. 上限:分配给 VM 的 VCPU 上限。
  2. 份额:如果发生了抢占,则根据份额分配资源
  3. 预留:给核心VM预留资源,保证其业务稳定

例子:某服务器有1个CPU、1核、24线程(24GHz)分给3台VM。根据 VCPU的计算公式得出 (CPU 个数 x 核数 x 线程数),可以虚拟出来 24 个 vCPU,这里的 24 个 vCPU指的是单台 VM 所能获得最大 vCPU 上限。加入3台VM都是分配8个 vCPU,则没有发生CPU 资源的抢占,那么每个 VM 使用的 CPU 资源都是 8GHz (24/3 平均分配)。假如资源发生了抢占,VM1 - VM3 都分配了 24个 vCPU。可以分配给单台VM所在物理CPU虚拟出来的最大 vCPU 个数,这时真实的物理 CPU 资源则不是根据 vCPU 个数来确定对应的使用资源,而是根据份额来分配资源

cpu_virtualization_qos

上面 VM1 - VM3 虽然都是被分配到 24个 vCPU 上,但是它们使用的真实物理 CPU 的资源却是不同的。


CPU 的预留

如果在上述的 VM 中,某个VM开启了CPU的资源预留,资源预留则代表的是最低的使用资源,如果给 VM1 预留了 8GHz 的CPU资源(在VM1-VM3同时分配24个 vCPU 场景下),即使 VM1不使用,别的 VM 也不能抢占。

cpu_virtualization_reserve

如上图,VM1 预留8GHz 的 CPU 资源,的那是按照份额来分他只能使用 4GHz 的CPU 资源,剩下的4GHz 资源要从 VM2 ,VM3 获得资源去抢占。

根据份额比例VM2要分配给VM1:2/5×4=1.6GHz的CPU资源。

而VM3则要分给VM1:3/5×4=2.4GHz的CPU资源。

所以VM2使用了:8-1.6=6.4GHz的CPU资源。

VM3使用了:12-2.4=9.6GHz的CPU资源。


内存虚拟化

CPU和内存是紧密结合的,因而内存虚拟化和CPU虚拟化是一起完成的。KVM 实现客户机内存的方式是利用 mmap 系统调用,在QEMU 主线程的虚拟地址空间中声明一段连续大小的空间用于客户机物理内存的映射。

VMM 内存虚拟化实现方式有两种:

  • 软件方式:通过软件实现内存地址的翻译,比如 Shadow page tabe (影子页表)
  • 硬件实现:基于CPU 的辅助虚拟化功能呢高,比如 AMD 的 NPT 和 Intel 的 EPT 技术。

在未引入内存虚拟化之前,OS每次使用内存地址的时候,总是从0号地址开始。由于每个物理服务器只运行一个OS,这个OS负责所有的硬件资源分配所以不会引起0号物理内存地址的抢用。而引入虚拟化技术后,物理主机上运行多个Guest OS,多个Guest OS都争抢0号内存地址使用,但是真正的物理内存地址0号只有一个。为了解决这个问题,由VMM虚拟出来多个0号物理地址给每个VM上的Guest OS来使用。

memory_virtualization

VM中保存着由VM映射到VMM虚拟出来的地址空间(VA—PA),而VMM保存着由VMM映射到真实的内存地址(PA—MA)。


主机内存超分配技术

使用内存超分配技术的好处是可以在主机物理内存容量不变的情况下,使用内存超分配技术来提高VM的密度,或者是在VM密度不变的情况下,通过内存超分配技术来节省内存的成本开销。

例如:VM1,VM2,VM3都申请了2G内存容量,但是都暂时只用到了1G的真实内存容量。内存超分配技术就是VM使用了多少内存就分配给多少内存,将未用到的内存指向一个“共享内存”。如上图,VM1-VM3共享剩下的未写数据的零页1G容量内存。从而达到VM1,VM2,VM3看起来都是2G内存。而实际VM1,VM2,VM3都只有1G的实际内存使用量。

memory_virtualization_oversold

如果3台VM都实际使用了2G的真实物理内存容量,则就需要分配给真实的2G内存容量,否则会带来内存溢出等风险。

(内存超分配最高可以达到物理内存大小的50%。)


内存复用技术

内存复用技术是指在VM内存不够的情况下,合理的通过内存复用技术从而带来更高的性能体验。

内存复用有三种基本的实现方式:

  1. 内存共享+写时复制:VM之间共享同一物理内存空间,VM对此空间只有读取操作的权限,当VM需要对内存进行写操作时,则开辟另一内存空间,并建立映射关系。

  2. 内存置换:虚拟机长时间未访问的内存内容被置换到外存储中,并建立映射,当虚拟机再次访问该内容时再置换到内存中。(通过热点因子计算冷热数据,将冷数据置换到外存中)

  3. 内存气泡:底层虚拟化系统(Hypervisor)通过内存气泡,将内存使用率较低的VM的内存,收集起来并释放给内存使用率较高的VM来使用,从而提升内存的利用率。

    memory_virualization_multiplex


内存的 QOS

对不同的需求类型来指定内存的 QOS 策略,从而达到合理的内存资源分配,具体策略如下:

  1. 内存的上限:内存在VM创建的时候给定的内存容量便形成了 VM 的内存上限。
  2. 内存的份额:在VM内存发生抢占的时候根据内存分配的份额来分配物理内存的资源
  3. 内存的预留:内存的预留内存预留指的是将一部分内存资源从资源池里提取出来,给特定的 VM 来使用,即使分配了内存预留的VM世纪使用内存小于给它预留的内存容量,在发生内存抢占的情况下也不会将此预留的内存分配给其他VM使用。

具体 QOS 策略和CPU一致。

memory_virtualization_qos

如上图,当VM1和VM3都请求使用10G内存空间时,此时则发生了抢占,因为真实的物理内存空间才24G,则根据份额进行内存的分配,即:VM1分配了4G内存空间,VM2分配了8G内存空间,VM3分配了12G内存空间。

补充关于内存容量的上限:内存上限在VM创建时就已经确定了。上图VM3根据份额分配了12G的内存空间,如果在创建VM时确定了它的内存空间为8G,则即使分配给它12G内存空间,但它仍然只能使用8G内存空间。内存的空间大小,后期也可以进行调整,但必须将VM离线后才能调整


I/O虚拟化

现实中的外设资源是有限的,为了满足多个客户机操作系统的需求,VMM必须通过I/O虚拟化的方式来复用有限的外设资源。

VMM/hypervisor提供了两种机制来实现对I/O设备的访问,一种是透传(passthrough),一种是模拟(emulation)


  • 穿透(passthrough)

所谓passthrough,就是指guest VM可以透过VMM,直接访问I/O硬件,这样guest VM的I/O操作路径几乎和无虚拟化环境下的I/O路径相同,性能自然是非常高的。

由于一些 I/O 设备支持 DMA(Direct Memory Access)技术,DMA是直接在设备和物理内存之间传输数据,其传输过程绕过了CPU,对于一个支持DMA技术的设备,需要 IOMMU 技术,来再进行一次映射。

IOMMU (IO 内存管理单元)查找的页表通常是专门的 I/O page tables。一些硬件也为了加速查找过程有类似 EPT TLB的 IOTLB(Translation Lookaside Buffer 地址翻译转换缓存) 硬件单元。1

其存在热迁移困难的缺点,不是主流的方案。


  • 模拟(emulation)

在hypervisor模型中,VMM直接就可以提供各种外设驱动,因此实现对guest VM所访问设备的模拟是很方便的。对于混合模型,设备模拟的方法就要稍微复杂一些。在混合模型中,guest VM访问设备的请求依然是会被VMM“截获”,根据I/O编址类型的不同,截获的方法也不一样。

对于I/O单独编址的PMIO(Port Mapped I/O),是使用in/out, ins/outs指令来读写的,所以只需要将这几个指令设定为会产生VM exit的敏感指令就可以了。对于和memory统一编址的MMIO(Memory Maped I/O),如果不为其使用的I/O地址设置对应的页表项,那么在访问这些地址的时候势必会产生page fault,这样的I/O访问也可以被VMM成功截获。2

virtio 便是其中的典型代表。Virtio最早由Rusty Russell于2007年在IBM工作期间开发,之后迅速成为KVM等主流虚拟化方案中默认的I/O虚拟化机制。

在virtio模型中,UOS为驱动数据的交互提供的接口被称为Frontend virtio driver (FE),FE只需要负责建立共享缓冲区,并产生I/O请求即可。SOS中提供的驱动交互接口则被称为Backend virtio driver (BE),BE会接收VMM转发的来自FE的请求,并交给SOS中的设备驱动程序处理。


华为云的I/O虚拟化底层采用的是前后端驱动方式:VMM截获客户操作系统对设备的请求访问,然后通过软件的方式来模拟真实的设备的效果。


网络虚拟化

KVM 网络虚拟化有主要四种模型 隔离模型、路由模型、NAT模型、桥接模型。

  • 隔离模型:该模型的特点是宿主机上的所有虚拟机之间可以组建网络,但是虚拟机无法与宿主机进行通信,也无法与其他网络的主机或其他宿主机上的虚拟机进行通信;相当于将虚拟机只是连接到一个交换机上,而这个交换机是在宿主机上虚拟出来的,即我们通常所说的网桥设备

  • 路由模型:该模型的特点是在隔离模型的基础上,在宿主机开启了ip路由转发功能,此时的宿主机相当于路由器,完成虚拟机与宿主机的数据报文转发。因此,虚拟机可以宿主机的物理网卡进行通信,但是无法与宿主机之外的主机进行通信,因为宿主机没有对源地址转换,报文可以送到外部主机,但是外部主机无法回应。

  • NAT模型:该模型的特点是当虚拟机需要与外部进行通信时,需要将源IP地址转换为物理网卡的IP地址,这样外部主机接收到报文后可以正确的将响应报文发送给目标IP地址(宿主机的物理网卡IP地址),因此,实现虚拟机与外部的通信;

    注意:该模型仅仅是实现了源地址转换,实现虚拟机与外部网络的通信,但那是外部网络无法访问虚拟机,如果要实现,则需要在宿主机做目标地址转换。

  • 桥接模型:该模型的特点是通过创建一个虚拟网卡,为该虚拟机网卡分配可以访问外部网络的IP地址;此时的物理网卡相当于一台交换机设备;虚拟机可以分配与外部网络通信的IP地址实现与外部网络的通信;此时,虚拟机相当于宿主机所在的局域网内单独的一台主机,它宿主机的地位是同等的,没有依存关系。

分布式交换机

一般网络虚拟化少不了路由器、网桥、交换机等概念,而虚拟计算集群中的网络通信是通过SDN(软件定义网络)实现的,诸如 Linux Bridge 、OVS(Open VSwitch)等。

而在云厂商内部由于更复杂的网络需求。一般需要对网络设备进行进一步的集联和分布式开发。

  • 分布式交换机(Distrubuted Virtual Switch)

利用分布式虚拟化的技术,可以在实现与物理交换机同样的效果,对经过虚拟化的服务器进行数据的高效率传输与管理。实现逻辑上的业务,功能的整合。并且介于虚拟化服务器技术,DVS可以实现更加统一的管理服务器,保障数据的安全稳定,实现虚拟机的迁移,HA数据容灾等

当利用服务器虚拟化技术,我们可以在一个服务器上虚拟出多台虚拟机为不同的业务提供数据的服务。此时,将一台物理服务器叫做一个CNA节点。

distrubuted_virtual_switch



参考:


  1. https://zhuanlan.zhihu.com/p/69627614 ↩︎

  2. https://zhuanlan.zhihu.com/p/75649223 ↩︎