您的位置:首页 > 其它

虚拟化技术系列-核心虚拟化技术概述

2014-01-21 22:16 330 查看
从此篇开始,将进入虚拟化技术的核心技术篇章。本篇只涉及基本概念,具体实现见后续章节。

所谓的虚拟化技术核心技术,指的就是如何支持让多个虚拟机在同一物理机器上运行起来的。计算机物理资源,简单来说可分为三类:CPU、内存、IO设备。

在展开讲解Hypervisor关于CPU资源虚拟化的实现前,先来回忆下OS中是如何支持多用户的。

说到OS中的多用户,天然就会想到OS中的进程/任务/线程的概念,不同OS里称呼不一样,这里不做区分,总而言之:时间片被分配的对象就是OS上的用户。

在单核物理机上,要运行多个用户的程序,方法上很简单:从时间维度进行切割。根据一定的调度算法、策略、优先级,将时间片分配给不同的用户程序;

而在多核物理机上,运行多用户的程序就要多考虑一个维度:空间。还需要涉及到哪些用户可运行在哪个核上,是否对称,负载均衡、调度优先级及策略是如何,等等。

当然,OS内核在实现上述内容的时候,绝不如此轻描淡写,scheduler的代码,往往是一个OS的重中之重。可自行参考相关OS的内核代码实现。

上述描述,可引出如下结论:将CPU资源调度给不同的用户,可从时间和空间两个维度入手。

现在回到虚拟机平台上来。虚拟机平台管理的对象,是多个虚拟机;而OS管理的,则是多个任务或多个进程。所以,本质上来看,两者是一致的。如果要说区别,无外乎调度对象,从重量级来说,虚拟机调度的上下文要大于任务或进程的上下文而已。但可以肯定的一点是,虚拟机平台关于CPU资源在多虚拟机间的分配,也无外乎分时和划分空间两个维度的管理,因此不管是XEN还是KVM,如果去查看其调度器部分的源代码,都会发现和Linux调度器实现上的惊人相似(sorry,KVM好像直接就是用了Linux的调度器)

CPU资源的虚拟化,从概念上来说,就是这么简单。现今,多核处理器已相当普遍,8核以上的处理器比比皆是,因此很多时候,虚拟机共核的部署方式并不一定要采用;从物理上进行核的隔离,尽量避免虚拟机间共享CPU资源,带来的好处是显然的:隔离资源意味着错误的隔离,运行过程中干扰的降低,某虚拟机的crash不会影响其他虚拟机的正常运行;同时上下文调度的减少,也意味着性能的提升。

接下来讲述内存资源虚拟化。还是先回到OS的角度来考虑这个问题。以Linux的内存管理为例。

我们知道,Linux的内存管理分为几个层次:物理内存的管理、进程虚拟地址空间的管理。内核负责物理内存的分配,以及各个进程虚实地址的映射。每个进程都看到同样的虚拟地址空间0-4G(32位为例),由内核负责页表的管理。Linux内存管理实现虽然复杂,但貌似做的事情主要就两件:物理内存的分配,进程页表管理。

在Hypervisor下,内存资源的虚拟化管理,概念上同OS是类似的。

首先,Hypervisor也需要负责物理内存资源在虚拟机间的分配,除了需要同其他虚拟机通过共享内存进行通信之外,一般一个虚拟机的内存是独享的。例:系统有4G物理内存,2个虚拟机,每个虚拟机分配2G物理内存,彼此之间无法访问对方的内存资源;虚拟机间的共享内存,一般用于设备共享管理、虚拟机间通信,这里暂时不展开这一点。

其次,虚拟机也需要维护虚实地址映射管理;但是虚拟机的虚实地址映射比OS要复杂一点,因为有三重地址关系:虚拟机虚拟内存VA,虚拟机物理内存PA,机器真实物理内存MA。系统需要维护两张页表,以完成VA->PA->HA的转换,之后又HA是机器可识别的地址。一般情况下,虚拟机OS本身维护了一张页表完成VA到PA的转换,而Hypervisor维护另一张页表,完成PA到MA的转换。具体实现方式,在不同虚拟机平台上差异较大,同是跟硬件的支持也强相关。例如X86的EPT扩张页表就可用于提供地址翻译工作的加速和简化;ARM的SMMU技术也是类似的硬件虚拟化方案。后文内存虚拟化实现章节会详细讲述上述的内容。

IO虚拟化。IO包含各类字符设备、块设备和网络设备。

前面提及的两种资源,内存和CPU天然存在可分割的基因,但在屋里服务器上,IO外设往往只有一套。

传统的IO设备虚拟化,采用软件模拟的方式来解决;

解决方案1:设备模拟。如QEMU这类模拟器,可用软件的方式来模拟硬件的行为。当虚拟机访问外设的时候,系统会触发一个异常事件,在异常处理中,Hypervisor会将程序的控制权交给模拟器或设备访问模拟程序,完成一次设备访问,并把设备访问的结果在退出异常之后返回给虚拟机。这类方案,带来的性能下降是比较大的,而且模拟器本身的实现也是比骄复杂的,毕竟不同的外设很难复用模拟器代码。

解决方案2:设备访问代理模式。在Hypervisor或某个虚拟机中部署真是的设备访问驱动程序,用来做后端代理,而在其他虚拟机上部署前段程序。前段程序可发出设备访问的请求,请求数据会被后端程序捕捉到;后端程序根据捕捉到的数据进行设备的访问,并将访问结果返回给前段驱动程序。这类解决方案,也叫半虚拟化驱动。XEN的前后端驱动、KVM的virtio都属于这类解决方案。

解决方案3:硬件支持虚拟化。这类虚拟化方案,事实上就是通过扩展设备本身来支持虚拟化。最流行的就是SRIOV设备了。如Intel的82599网卡,可将一个网卡设备,分成多个VF设备,每个虚拟机可拥有一个或多个VF设备,VF设备之间拥有不同的PCI配置空间,可呈现为一张独立的网卡,因此这类设备也同内存、CPU一样拥有的分割的可能。SRIOV本身是PCIe协议的扩展。

值得一提的是,IO虚拟化是目前虚拟化技术的最后一块短板,尤其是高速设备如网卡的虚拟化,用软件虚拟化的方式很难提高性能,往往需要硬件的支持。各大设备厂商也都在这一块发力。而在具体的应用中,往往是上述几个方案并用,不同的设备灵活采用不同的解决方案。一般只有高速设备才会采用硬件虚拟化方案。

本章,只是从概念上先将虚拟化的解决方案进行一定的陈述,尚不涉及具体的实现。了解完本文的信息后,接下来就可具体的就CPU、内存、外设的虚拟化进行更加深入的了解了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: