虚拟化技术(一)——虚拟化简介

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/u012802702/article/details/86561188

一、云计算

当年随着云计算的概念被大肆炒作,近乎妇孺皆知,至于它实际是否如媒体宣传的那样,在此不做评论,我们只探讨技术。

云计算的理念是使人们(目前主要是企业)可以像用电一样使用计算资源。按照我的理解云计算就是将大量的物理服务器的CPU,磁盘,内存等硬件资源集中起来,将他们组成一个大的逻辑概念上的资源池,即进行逻辑上抽象的“池化”,从外面看上去他就是一个整体,需要注意的是这里的"资源池"中最小的粒度不再是物理的服务器,而是具体的资源。这也是为什么叫“资源池”而不是“服务器池”。一个更直观的理解就是将所有的服务器的CPU抽出来组成一个CPU的池,所有的内存抽出来组成一个内存池,在这个逻辑抽象的资源池里面不再有服务器的单位存在,他们的资源已经被完全打散,例如资源池有1T的内存,和1000个CPU核,外部的用户不会知道这些资源是由多少台物理的服务器提供的,即俗称的云。你不会知道也不会想知道这个云里的水蒸气是从哪里来的。当我们需要计算资源(CPU,内存,磁盘,etc)时就从各个资源池里取,且需要多少资源就取多少资源,例如我需要1000个CPU和1T的内存,那就从CPU的池子里取1000个cpu,从内存的池子里捞1T的内存;就好像我们用电用燃气一样简单,我不要自己去维护一个发电机。使用计算资源的用户也不需要在自己的机房维护一台台物理服务器。更进一步,在这个资源池的上层可以通过提供一个类似传统操作系统的资源管理和调度工具对这些资源进行管理,谁需要资源就去向这个“操作系统”申请。众所周知的私有云领域的明星级软件OpenStack就是这样的一个“云操作系统”。顾名思义,操作系统的主要功能就是管理和监控各种硬件资源,如CPU,RAM,网络,磁盘等等。而OpenStack之所以叫云操作系统,是因为他与传统的操作系统不一样,它管理的不再是一台物理的服务器或者PC机,而是一个由众多物理服务器组成的分布式的大集群,也就是我们上面提到的那个逻辑概念上的资源池。

二、那虚拟化又是什么?跟云计算有什么关系?

虚拟化技术即Virtualization,wiki上的解释是:In computing, virtualization refers to the act of creating a virtual (rather than actual) version of something, including virtual computer hardware platforms, storage devices, and computer network resources.
我的理解,虚拟化是实现云计算的一种手段。上面提到,当我需要计算资源的时候我们向“云操作系统”申请资源,那它分配给我的资源以什么形式提供呢?最简单的,我们假设它直接从资源池中众多的物理机器中返回给我一台完整的物理服务器的让我使用,但是我们前面已经提到了,在资源池里面已经没有物理服务器的概念了:对用户来说,你已经无法区分哪个CPU来自于哪台服务器!

那"云操作系统"以什么样的形式提供资源?答案就是虚拟机,因为我们已经将资源池化了,当用户申请计算资源的时,如10个CPU,10G内存,10G磁盘,此时这个"云操作系统"就会从CPU池子里取10个CPU,从内存的池子里取10G内存,从磁盘的池子里取10G存储空间,将他们封装成一个虚拟机(其实就是一个封装了固定资源的虚拟的操作系统)提供给用户使用,从用户角度他得到这个虚拟机之后完全可以把他当做一台配置是10CPU,10G内存,10G存储的物理服务器使用。而虚拟化就是实现虚拟机的技术。与我们常用的PC机上虚拟化软件如VMwear,Virtual Box等软件不同的是,OpenStack是对多台物理服务器组成的集群资源进行管理,并封装成虚拟机对外提供服务,而不是针对一台服务器或PC机,将一台服务器或PC机虚拟化成一台或者多台虚拟机,每台虚拟机封装有一定的硬件资源(CPU内存以及磁盘)且各个虚拟间的资源是相互隔离的。从用户的角度上看,一个虚拟机就是一个完整的操作系统,对用户而言完全可以把它当做一台物理服务器去使用;对于在一台服务器或者PC机上隔离出一个或多个虚拟机的情况,也无非就是在一个操作系统上虚拟化出一个或多个操作系统,从而实现对单台物理机器的资源隔离。此外,原始的那个操作系统我们通常称为Host OS即宿主机或宿主操作系统,而在他上面虚拟化出来的一个或多个操作系统我们称为Guest OS或虚拟机。如下图:
虚拟机架构

三、对虚拟化的误解

其实很多人包括大多技术人员都一直认为“虚拟化”就意味着慢,意味着不稳定(CPU,IO,网络,etc),虚拟机相对于物理机而言确实有很多性能上的劣势,这点我们必须承认,但是它的优势也很明显:在提供一个完整操作系统功能的前提下实现资源隔离,即对资源进行封装(注意两个关键词,后面文章详细讨论)。

对于不了解虚拟化技术的大多数人,尤其是IT技术人员(小白级别的),一个很直观的感觉就是,要达到虚拟化的目的,在实现虚拟化的过程中就需要一个中间的软件层来完成虚拟化这件事,其实不然,虚拟机某些方面性能差的主要原因并不在此,甚至在有些方面它可以达到和物理机一样的性能。我们下面以CPU的虚拟化为例(聪明的你应该已经猜到了,操作系统无非就是管理各个硬件资源的,而虚拟机也无非就是在一个操作系统上虚拟另一个操作系统,必然会涉及到各个硬件的虚拟化的细分,如CPU的虚拟化,内存的虚拟化等等)

为了更好的说明这点,所以在讲CPU虚拟化技术之前,有必要先说下模拟(simulation)技术。

四、模拟(simulation)技术

以安卓模拟器(如BlueStacks)为例,安卓模拟器的作用就是可以实现在X86的机器(例如我们的PC机)上运行基于安卓的应用程序,即它可以在PC机模拟一个安卓运行环境,用户可以在这个环境上面安装安卓的应用程序。从CPU角度讲就是在X86的机器上模拟一个基于ARM的环境。而X86与ARM的CPU指令集是不一样的,且差别很大。更具体的说就是:当你在模拟器上操作APP的时候,因为APP程序调用的都是安卓的底层驱动(基于ARM指令集),而最终这些指令需要在X86上(即我们的PC上)执行,所以模拟器需要先将APP提交给它的基于ARM的指令集翻译成底层的X86的指令集,然后在X86(也就是我们的PC)上执行,X86会将执行完成的结果反馈给模拟器,模拟器取得执行结果之后再将结果翻译成基于ARM指令集的信息,反馈给APP。模拟器就是经由这样一系列的指令集的翻译才使得安卓的APP得以在PC机上运行。

如上,模拟(Simulation)主要的开销来自于指令集的翻译,因为它要在软件上面模拟一个基于RAM的硬件CPU,正因为模拟器(安卓模拟器)需要在X86的PC机上模拟一个ARM的CPU出来,所以模拟的开销是比较大的。直接导致性能会比较差。

五、虚拟化的开销

了解了模拟之后我们在回到之前的问题:虚拟机的开销主要在哪里呢?但是虚拟化(Virtualization)与模拟(Simulation)完全不同,以CPU的虚拟化为例,无论是传统的XEN还是现在常用的KVM(后面的文章会详细介绍两种虚拟化技术)都没有类似模拟(Simulation)那样的中间软件层进行指令集翻译这一步,因为虚拟机的指令集与Host OS(宿主机)的指令集是一样的,都是X86的指令集,所以他的开销比模拟小的多。此外虚拟化(Virtualization)与Intel的VT-x,AMD的AMD-V等硬件辅助虚拟化技术结合起来可以让虚机里面的指令直接在Host OS的CPU上执行,所以他的性能开销不是因为有了虚拟化层导致的能开销,他的性能开销主要是因为虚机的操作系统里面的特权指令的嵌入和退出导致的性能损耗。

六、关于特权指令集

到这里有不得不提下操作系统的一些相关的概念,无需深究了解即可:计算机CPU指令的运行分为4个特权集从ring0到ring3 ,通常情况下操作系统的内核是运行在ring0这个特权集,用户的应用程序运行在3的特权集的,即0的特权集最高,3的特权集最低,但是0特权集是独占模式的,而因为是独占模式,如果宿主机的 Kernel 占用了ring0,那么虚机的 Kernel 就只能在ring1运行,而在ring1运行就会导致一些问题,所以虚机化技术主要就是解决,你的ring0如果被宿主机占了,虚机的 Kernel 怎么去的ring0的权限。 虚拟化做的就是让ring0这个特权集可以被宿主机和各个虚机所共享。即当他们要执行指令的时候需要进行特权集的切换,即从ring1陷入到ring0去之后执行相关的指令,执行完成后再进行特权集的退出,从ring0退出出来。而这个陷入和退出的动作是导致虚拟化性能损耗的主要原因,与CPU类似在外部设备,内存,网络和IO中也有类似的问题,不完全一样但也有类似的问题会导致性能的损耗。所以当你的指令中没有涉及到到特权指令集的运算的时候,同样的指令在虚拟机中执行和在物理机中执行效率是一样的,不会带来额外的开销。
未完待续。。。。(谨以此系列文章缅怀逝去的学生时代)
微信公众号

猜你喜欢

转载自blog.csdn.net/u012802702/article/details/86561188