4.1.1 比较几种虚拟化实现技术

最后更新2021/08/18

虚拟化技术是一个非常笼统的概念,本身包含了很多维度的规范、定义。在前面章节已经从概念上对几个重要视角做了说明,例如关于资源共享和隔离的范畴和颗粒度,虚拟化所在的层次和相互关系等。通常,虚拟化的核心是对物理CPU的虚拟化,与此配合的会有整机虚拟化(虚拟机)、整机各组件虚拟化(CPU、内存、设备),或者软件的运行环境虚拟化等等。所有这些之中,最为重要的则是与CPU或者说是指令执行有关的虚拟化。

今天,在IT业界,有许多虚拟化”品牌“或技术名词,它们实际上都是包含了特定虚拟化部分,实现了前文所说的某一些资源的虚拟化的具体技术实现,实现方案表面开起来各不相同,而其实质又无太大区别。下面是对与PowerVM相关的虚拟化技术做最简单的解释。

  • PowerVM是一种硬件辅助的综合虚拟化技术,包括虚拟CPU,虚拟机,虚拟IO设备(以太网卡、磁盘、光纤通道卡、光盘),虚拟内存等实现,仅在IBM Power系列服务器上有实现,是绑定硬件收费的产品,以硬件+软件方式提供;

PowerVM的优势在于稳定,最高效,这是由于PowerVM采用了独立的硬件或CPU设计(FSP+CPU PURR+硬件TLB等)对虚拟化过程从初始化到管理分配都具有绝对的,优先的,硬件化的控制实现。与大部分”软“实现的虚拟化技术相比,无论是基于”自我管理自我“的内核虚拟化,抑或是应用级别控制的control group,一个最大的安全隐患是内核驱动程序挂掉,有可能影响整个内核,进而造成全部虚拟机崩溃。硬件TLB之类的设计则保证了虚拟机之间的安全隔离,从技术上保证了诸如缓存溢出等黑客方案无法从内部攻破虚拟机间隔离。额外的硬件设计,也保证了对虚拟化实现所造成的性能损失最低。

为了避免100%硬件实现的成本、研发周期长等劣势,PowerVM其实也不是100%硬件实现,而是在关键虚拟化管理部分采用硬件、微码、协处理CPU(FSP)实现,而真正的功能实现大部分也是软件,当然,在相应的软件实现中,秉承IBM理念,依然是增加了各种冗余保证,诸如双VIO、主备SEA卡等等。

在PowerVM虚拟化实现,CPU硬件进行计数,FSP/Hypervisor微码进行分区CPU资源调配,没有任何分区内CPU运行的程序可以超越自己所处分区环境,即使由黑客自己任意写代码去从内向外攻击也无法突破。但硬件安全保障的代价就是功能发展较慢,成本更高。在对稳定、可靠要求比较高,业务并非爆发式增长的领域,PowerVM有领域优势。

  • VMWare是一种纯软件实现的综合虚拟化技术,但此软件是广义的软件,暨包含操作系统,事实上,VMWare也是将虚拟化实现在其操作系统(Linux)内核里完成的。它可以从CPU、IO设备到虚拟机,各个层面实现虚拟化。

由于VMWare虚拟化技术是纯软件实现,各种新功能发展非常快,可以号称SDX(SDN软件定义网络,SDS软件定义存储,SD。。。软件什么都可以定义:-) )。前面也介绍了软实现的缺点:性能损失稍大,例如10%之内都是可接收的正常损失;稳定性,安全性稍差,有潜在的单分区、特定驱动程序崩溃整个物理机的可能;

总体来说,当硬件性能飞速提升,业务高速发展的时代,赢得时间就是最高追求,哪管成熟不成熟,稳定不稳定?只要随着软件程序不断进步,对各种攻击、故障处理越来越好,先占领市场再回头修修补补。

  • 微内核。既然单一宏内核安全性、可靠性较差,那么换成微内核,以服务方式实现呢?这种操作系统概念本身就超越了CPU虚拟化的层次,由操作系统自身跨越了虚拟机,称为一个虚拟的操作系统。这其实也是早期虚拟化技术发展过程中的一种尝试。最早的Plan 9操作系统就是此方案的试探。

微内核模型可以说是一种超越虚拟化的虚拟化存在,无需虚拟化,就把一个虚拟机的概念自动跨越了多台物理机。但是这一步迈出的太早,即使到了几十年后的今天,微内核的操作系统依然面临性能困扰,就是在同一物理机内部的多个运行进程之间(包括用户进程和操作系统驱动进程),数据传送的性能都无法保证,更不用说跨越物理机之间进行非直接内存通信了。与此同时,安全性并未妥善解决,对众多资源的索引和管理更加复杂困难。

  • Control Group 是Linux引入的操作系统服务虚拟化技术,比内核虚拟化仿真虚拟机更轻便一些,它不做虚拟机仿真,而通过设定各个分组,以分组为单位对系统资源(CPU,内存,磁盘,网络)进行计数,每组有一定的上限值,当此组某种资源使用达到上限后(百分比),此组对应的应用程序就会被挂起,直到下一个时间片开始重新计数。

CGroup技术并没有增加系统的安全性,可靠性,甚至性能上比内核虚拟化还稍低(增加了额外的计数消耗,当然,这个消耗可以忽略不计,主要是超限之后切换损耗),但实现简便,管理容易,面向资源控制(计费)具有独到的优势。

  • 容器(极小化资源的屏蔽组)这是与CGroup相关(可以包含CGroup功能实现),但目标偏向安全隔离和简便部署的一种虚拟化技术。我们知道,一个全功能的虚拟机,或者操作系统具有相当多的复杂组件,但对于特定应用程序,并不需要面面俱到使用所有资源,额外提供的资源既增加了部署复杂性,又降低了系统的安全性。通过极小化所需的资源和需求定义,将这些数据打包在一起整体实现的方案,就是容器虚拟化技术。

在容器内运行的程序,只能看到应当分配给它的资源和系统文件、服务,其它未事先规划的一切都不存在。既然你看不到,自然用不了,既然你不应使用,也无需配置提供。当然,这里依然存在突破安全隔离壁垒的危险,但多一层隔离,就多一层安全。

  • 基于用户程序的虚拟机把所有一切都绑定到用户级应用程序之中。与内核级虚拟化的区别在于安全保障。用户级虚拟机被突破之后,依然只是用户级应用程序,并不具有内核级权限;内核虚拟化的虚拟机被突破,立刻就有内核权限,可以为所欲为,造成的破坏更为巨大。另外,作为用户程序,其启动过程无需初始化硬件设备(已经被内核初始化好),启动也会快一些。但是,由于多了一层用户应用程序,性能损失比内核级虚拟化大了不少,特别是由于数据延时造成的性能损失更大。

  • 跨指令集仿真Qemu。这个概念只针对于虚拟化运行的程序、虚拟机CPU与当前物理机采用不同的CPU指令集。在这种情况下,每个虚拟机内运行的指令都需要通过解码,转换为当前物理CPU指令,性能会急剧下降,一般最少会跌到同指令集CPU的1/5-1/10。其中,也有许多技术被用来尽可能提升运行效率,例如不做虚拟机仿真,而只做应用环境仿真,借用相同操作系统具有相同的系统调用接口这一特点,把所有被虚拟执行的应用程序从系统调用入口转换为同指令集的系统调用,这样只需要对用户应用程序的二进制指令进行仿真,到了系统调用层面,就是完全本地内核直接执行,不会再有性能损失。

根据我对通常程序的观察,普通程序在运行中,用户程序代码消耗CPU与系统进程消耗CPU之比一般为10 : 3 - 20 : 1,也就是在进行跨指令集仿真的时候,性能最好情况也要跌到7/20,大约1/3左右,比较差的情况只能达到百分之几的性能。


版权声明:本文为weixin_42051187原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。