【IT168评测中心】毫无疑问,在业界,微软Microsoft是当之无愧的软件霸主,不仅仅在操作系统上占据巨大的市场份额,更在数据库、迁入式移动计算、搜索引擎等各个方面都具有很强的影响力,在各个领域都不容忽视。由于低估微软在产品创新和销售执行方面的能力,众多的企业在与微软的竞争中遭遇挫折。
Virtualization and Consolidation with Hyper-V
微软进入虚拟化领域已经很有一段时间了(微软在2003年收购了推出了Virtual PC软件的Connectix公司,并在其后推出了Virtual Server服务器虚拟化软件),在Hpyer-V推出之前,微软在虚拟化领域尤其是服务器虚拟化领域可说是略显不自信,与竞争对手VMware的频频新品相比,Virtual PC和Virtual Server的发布和宣传都十分低调,毕竟,VMware/Xen等产品凭借出色的性能已经占据了大半江山。而现在,随着Hyper-V的正式推出,企业级虚拟化领域极可能会引起一场风暴,市场格局有可能迅速改变。
为什么微软的Hyper-V会具有这样的能力呢?
注:什么是虚拟化?
Hyper-V是一个Hypervisor(系统管理程序),开发代号为Viridian,它主要作用就是管理、调度虚拟机的创建和运行,并提供硬件资源的虚拟化。Hyper-V是微软伴随Windows Server 2008最新推出的服务器虚拟化解决方案,在Windows Server 2008发布的时候,集成了一个Beta版本的Hyper-V,微软承诺在180天之内会提供正式版的Hyper-V。Window Server 2008是4月份发布的,180天就是不到6个月,因此微软会在9月到10月之间发布正式版的Hyper-V,而目前已经到了RTM阶段,可以正常使用了。
Hyper-V跟微软自家的Virtual PC、Virtual Server等产品相比,有着很显著的区别,和竞争对手VMware Server/ESX Server也有很大不同:Hyper-V在构架上绝对是一个突破性的进展!
微软发布的架构图资料有很多,然而主要内容都很相似,就是上图那样。
Hyper-V之前、Virtual Server 2005 R2的架构
Hyper-V的本质是一个VMM(虚拟化管理程序),和微软之前的Virtual Server系列产品,处在的层次不同,它更接近于硬件,这一点比较像VMware的ESX Server系列,实际上Hyper-V属于微软的第一个裸金属虚拟化产品(Bare-Metal Virtualization)。然而,在一些基础架构上,Hyper-V和ESX Server又有着明显的不同,所以说,Hyper-V是很特别的,且看下页分解。
作为一个虚拟化产品,Hyper-V具有一个很特别的要求:处理器必须支持AMD-V或者Intel VT技术,也就是说,处理器必须具备硬件辅助虚拟化技术。
对于一个虚拟化产品来说,要求一个硬件特性是比较奇特的事情(要求支持一个指令集不算),微软之前的Virtual Server 2005R2不需要这个特性。对于VMware的产品来说,这也只是一个可选的特性,不像Hyper-V那样,是一个硬性的要求。处理器不支持VT/AMD-V,就无法运行Hyper-V。
关于VT的具体作用,可以查看x86虚拟化难题解决:Intel VT或者《从VT-x到VT-d Intel虚拟化技术发展蓝图》。VT,或者AMD-V,是一种硬件辅助虚拟化技术,用来解决Ring Privilege的问题,传统处理器下虚拟机通过使用指令转换的方法来在Ring 3执行Ring 0特权指令,严重影响性能,而VT则解决了这个问题。对VT的依赖和支持是Hyper-V架构的基础,也是Hyper-V最大的特点。
也因为Hyper-V需要处理器支持硬件虚拟化辅助,一部分处理器无法应用Hyper-V,只有较新、非Value型的处理器才能应用。例如访问www.microsoft.com只有75%的几率碰到部署在Hyper-V上的虚拟化服务器,剩下的25%都是未Hyper-V虚拟化的服务器。要在这些服务器上应用虚拟化,用户只能选择Virtual Server 2005 R2,或者其它公司的产品。
Microsoft Hyper-V和VMware ESX Server是比较相像的,都是Bare-Metal类型,但是它们的内核架构也有着明显的不同。微软在谈到竞争对手ESX Server时,总会提到,Hyper-V是微内核架构的,而ESX Server是单内核架构,Hyper-V要更好。
这两者具有什么不同?到底谁更好呢?
单内核(分层的内核)与微内核
单内核和微内核实际上是操作系统内核术语,操作系统的内核——实现核心功能的那部分——可能是微内核(Micro kernel),也可能是单内核(Monolithic kernel,有时也叫宏内核Macro kernel)。按照类似封装的形式,这些术语定义如下:
微内核(Micro kernel)――在微内核中,最常用的功能被精心挑选设计在内核模式(或者按照上一页的说法,在x86上是Ring 0权限下)运行的一个进程上,而其它大部分不怎么重要的核心功能都作为单独的进程运行在用户模式下(类似地,Ring 3权限下)运行,它们通过消息传递进行通讯(例如,Windows采用的进程间通信IPC机制,IPC就是Inter Process Communication)。最基本的思想就是要尽量地小。通常微内核只包含了进程调度、内存管理和进程间通信这几个根本的功能。
这种设计具有许多好处,例如增加了灵活性,易于维护,易于移植。微内核的模块化设计让其他核心功能模块都只依赖于微内核模块或其他模块,并不直接依赖硬件。要添加新的特性只需要另行编写用户模式的微内核服务器。而只需把微内核本身进行移植就能够完成将整个内核移植到新的平台上。
由于模块化的设计,不包含在微内核内的驱动程序可以动态地加载,或者卸载。同时,微内核也不依赖于固定的文件系统,用户可以随意选择对文件系统的支持。用户甚至能够在系统运行时将研发出的新系统模块或需要替换现有模块的模块直接而且迅速的加入系统。不需要的模块将不会被加载到内存中,因此微内核就能够更有效的利用内存。微内核还具有的好处是实时性、安全性比较好,并且更适合于构建分布式操作系统和面向对象操作系统。
微内核操作系统的典型例子是,Mach(一个非原生的分布式操作系统内核,被众多操作系统采用,例如,被应用在Mac OS X上)、IBM AIX、BeOS,以及Windows NT(Windows Server 2003和Windows Server 2008都包含其内),还有著名的Minix(一个主要用于教学的Unix系统)和Amoeba(一个真正原生的分布式操作系统)。
单内核(Monolithic kernel)――单内核是个很大的进程。它的内部又能够被分为若干模块(或层次,或其他),但是在运行的时候,它是一个单独的大型二进制映象。因为是在同一个进程内,其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是微内核那样在多个进程之间进行消息传递。因此在运行效率上,单内核会具有一定的好处。
单内核操作系统的典型例子是,大部分Linux,包括BSD在内的几乎所有的Unix,MS-DOS,Windows 9x。例如Sun Solaris的内核就运行着数百个线程以实现各种功能,而编译过Linux内核的人就知道Linux内核有数十MB之巨。
单内核和微内核哪个更好显然是一个很有争议性的问题,必须说明的很有趣的一点是,这种争论经常会令人想到上一个时代CPU领域中RISC和CISC的斗争。现代的成功CPU设计中都包含了任何的这两种技术,就像现在Linux(单内核)和Windows NT(微内核)实际上都是微内核和单内核的混合产物一样,只是或多或少的问题而已。历史上有过这样的争论,Linux(单内核)的作者Linus和Minix/Amoeba(均为微内核)的作者Andrew S. Tanenbaum教授在讨论组上论战,并卷入了大量的爱好者。最终Linus也同意Tanenbaum微内核架构更为先进的论点。
掉书袋就到这里,回到Hyper-V上来,通过采用微内核架构,Hyper-V在体积上很有优势,它的大小只有300k左右(似乎新版本的更加小),而VMware ESX Server的Linux核心则非常大。就VMM虚拟化管理程序来说,需要的功能不多,因此采用微内核架构是很合适的,运行效率可以很高。不过就理论上来说,合理配置的单内核其实和微内核也很相似。哪一种性能更好?这要在测试之后才能知晓了,不过在这之前,我们接下来可以先看看微内核带来的一个好处:设备驱动程序的变迁。
注:分布式操作系统(Distributed Operation Systems)
分布式操作系统DOS(可不是Disk Operation System)的具有多个定义,是是管理分布式系统的资源的操作系统。这样的说法比较抽象,我们可以通过与网络操作系统(例如,我们使用的Windows)对比来简单阐述分布式操作系统的特点:
(1)分布性。分布式操作系统的处理和控制功能均为分布式的;网络操作系统其控制功能却是集中在某个或某些主机或网络服务器中,即集中式控制方式。
(2)并行性。分布式操作系统具有任务分配功能,可将多个任务分配到多个处理单元上,使这些任务并行执行,从而加速了任务的执行;而网络操作系统通常无任务分配功能,网络中每个用户的一个或多个任务通常都在本地计算机上处理。
(3)透明性。分布式操作系统通常能很好地隐藏系统内部的实现细节。包括对象的物理位置、并发控制和系统故障等对用户都是透明的。例如,当用户要访问某个文件时,只需提供文件名而无须知道(所要访问的对象)它是驻留在那个站点上,即可对它进行访问,亦即具有物理位置的透明性。此外,当分布式操作系统运行一个程序时,该程序无需经过特别设计以及经过用户特别设置,就可以自动划分到多个处理器上并行运行。
(4)共享性。分布式操作系统支持系统中所有用户对分布在各个站点上的软硬件资源的共享和透明方式访问。而网络操作系统所提供的资源共享功能仅局限于主机或网络服务器中资源,对于其它机器上的资源通常仅有使用该机的用户独占。
(5)健壮性。分布式操作系统由于处理器和控制功能的分布性而具有较好的可用性和可靠性,即健壮性,只有所有的处理节点损坏,一个分布式操作系统才算是崩溃了。
典型的分布式系统包括了SETI@Hom这样的项目,Cluster、集群、云计算,也属于分布式操作系统的范畴。典型的分布式操作系统有Amoeba、Mach、DCE等。
无论采用什么内核,驱动程序和文件系统总是必要的,虚拟机需要使用服务器的硬件就需要驱动程序,虚拟机的文档需要保存在适当的文件系统上。在单内核的VMware ESX Server上,驱动程序包含在单内核内部,虚拟机映像文件则保存在VMFS(一种类似EXT的文件系统)上,那么微内核架构的Hyper-V呢?
这就要谈到Hyper-V的VSP/VSC架构了,VSP是Virtualization Service Provider(虚拟化服务提供者),VSC则是Virtualization Services Consumer(虚拟化服务消费者),还有一个VMBus部件将放在“宿主操作系统”的VSP和虚拟机操作系统的VSC连接起来。实际上“宿主操作系统”也是一个虚拟机——就是你最初安装的、带有Hyper-V的Windows Server 2008,微软将其称为Parent Partition操作系统,而每一个虚拟机则称为Child Partition,虚拟机操作系统则称为Child Partition操作系统。
VSP与VPC,注意VSP并不是Virtual Storage Provider的缩写。Virtual Storage Provider属于VSP的一种
上图很好地解释了Hyper-V使用VSP/VSC架构解决驱动程序/文件系统的方式,通过加入VSP和VSC以及它们互相沟通的VMBus总线,Hyper-V将虚拟机的操作映射入Parent Partition的对应驱动程序/文件系统中,简化起来就如下图:
Hyper-V的VSPs/VSCs、VMBus架构
这种方式具有不少好处,例如,最明显地,Hyper-V可以兼容大量的驱动程序,而不必为虚拟机开发专用的驱动程序(ESX Server就是这样干的)。我们知道对于服务器而言,很重要的一个组成部分就是I/O,一个IO设备没有驱动程序是无法工作的。现在,只要设备能在Windows Server 2008下工作,那么Hyper-V虚拟机就能使用这些设备资源,再加上Windows驱动天生就比其他操作系统(如Linux)的驱动丰富,因此在硬件支持上Hyper-V具有着无可比拟的优势。VMware ESX Server甚至不能直接应用Linux驱动程序,需要另外进行额外的操作才能使用,因此VMware ESX Server容易遇到设备兼容性方面的问题,当然用户可以使用具备VMware认证的全套硬件以避免这个问题。
有利就有弊,VSP/VSC架构需要支持Hyper-V技术的客户端的支持,这样就大为限制了虚拟机操作系统的选择,不支持Hyper-V的客户操作系统只能使用设备模拟的方式,性能和以前的Virtual Server 2005 R2没有太大的分别,要享受到Hyper-V性能的提升,需要虚拟机使用Windows Server 2008,或者内含Xen的Linux/Unix。Hyper-V的客户机操作系统的选择确实只注明了Windows和少数几种Linux,虽然笔者猜测或多或少有着商业策略上的因素,不过从技术上来看,确实也有一些限制。
Hyper-V设备驱动的这个优点正好就和微内核驱动程序架构的优点一样,模块化,架构灵活,不需要更改就可以提供新硬件的支持。敏锐地用户可能会觉察到进程间通信带来的开销——确实有这样的问题,笔者曾询问微软的工程师,他们表示性能会有一点点地折扣。从笔者来看,通过内存地址转换的方式,开销有可能降到非常低。
顺便提一下,设备虚拟硬件辅助VT-d技术在Hyper-V下的实现很轻松,只需要开发Windows Server 2008下的驱动程序,不需要对Hyper-V进行改动。
Hyper-V还具有一个关于性能的重要特性:多处理器虚拟机,Hyper-V支持4 CPU的Windows Server 2008虚拟机,和2 CPU的Windows Server 2003虚拟机。多处理器虚拟机并不是一个Hyper-V才具有的特性,VMware的ESX Server早已经实现4 CPU的虚拟机,并且是在各种操作系统下(WMware Workstation也能提供2 CPU的虚拟机)。
如果服务器工作负载需要很高的性能,我们可以考虑使用多处理器的虚拟机。数据库服务器可以消耗掉大量的处理器资源,这时,多处理器虚拟机就是很必须的,就像我们做过的测试那样。当然,只有当工作负载确实需要的时候,才应该使用多处理器虚机,因为管理更多的处理器会带来一些额外的开销。就像早期Window NT具有单处理器和多处理器两种内核一样(单处理器版本去掉了一些多处理器才有的如同步之类的模块,并作了相关优化)。
进程状态及其转换示意图,进程的就在这些状态之间“旋转”
众所周知,为了保护共享数据,需要一些同步机制,例如锁、信号量等。通常,多处理器操作系统内核和驱动会采用自旋锁(Spin Lock,类似于互斥锁,但是保持时间更短。更详细的信息可以参考《Windows Internals》第四版,P152)的机制,在获得自旋锁之前,线程并不会阻塞,而是一直处于自旋状态,前提是自旋锁只会保持很短的时间。然而在虚拟化条件下,这个前提会被打破,因为虚拟处理器是按照时间片进行调度的。如果在保持自旋锁的时候竞争虚拟处理器,则其他虚拟处理器就要自旋很长时间,导致CPU循环的浪费,降低了虚拟机的性能。显然,多处理器虚拟机在繁忙的负载条件下,这种情况会频繁发生。
在Windows Server 2008内核以及Hyper-V Hypervisor中加入了一个创新设计,尽可能防止出现自旋锁的长时间等待条件,如果确实存在长时间等待条件,也会有效地加以检测并对其进行处理。这个方法叫做自旋锁启发方法,未实现自旋锁启发方法的虚拟机作系统将停在一个紧凑循环上旋转以等待其他虚拟处理器释放自旋锁,通常这个旋转可能会阻塞其中一个硬件 CPU,从而降低了虚拟化性能。而在自旋锁启发式操作系统中,自旋锁代码会在将要发生旋转时通过Hypercall API通知Hyper-V Hypervisor管理程序,这样Hypervisoer管理程序就可以立即调度执行另一个虚拟处理器并降低不必要的CPU使用。Hyper-V还还在调度程序和内存虚拟化逻辑上进行了优化以使它们在大多数临界区中都不会被锁定,从而确保多处理器系统能够获得很好的延展性。
在前些天的媒体测试见面会上,微软中国的工程师展示了Hyper-V虚拟机的效率,表明4 CPU的Windows Server 2008虚拟机,其延展性可以和物理4 CPU系统一较高下。当然,具体的提升仍然需要通过测试来评估。
注:自旋锁启发方法其实不完全是Hyper-V的内容,它更多是Windows Server 2008的核心内容。Vista也实现了这个自旋锁启发方法。
【IT168评测中心】不知不觉间说了很多显得有些深涩的内容,不过Hyper-V的特点总结起来就是:VT/AMD-V实现、微内核设计、VSP/VSC虚拟设备驱动架构以及虚拟处理器自旋锁启发架构,这些特性糅合在一起就形成了独特的Hyper-V。此外,$28的价格(或者免费:购买Windows Server 2008时附赠)也很值得一提。
更好的性能、更广泛的兼容性、更强的安全性,以及更便宜——这就是Hyper-V,从2003年收购Connetix后就沉寂的微软并没有睡着。从最早的Terminal Services,到早期的Virtual PC、Virtual Server、SoftGrid,到今天Hyper-V的推出,这些看似不经意的动作,现在看来均是为其全面的虚拟化战略实施做铺垫。而经过这样一系列的铺垫,微软的从数据中心到桌面虚拟化、全面的端到端的虚拟化战略已经正式部署完毕,我们已经可以看到,虚拟化市场即将到来的一场暴风雨。