什么是云计算?
定义:基于互联网的一种新型服务模式
使用场景:华为公有云,弹性云服务器
云计算类型的APP:百度网盘,华为手机备份,苹果iCloud、网易云音乐
云计算的特点
- 按需的自助服务
- 广泛的网络接入
- 资源池化
- 快速弹性收缩
- 可计量服务
计算的发展史
- 并行计算
- 并行计算的CPU可以来自同一台计算机,也可以来自同一网络中不同的计算机
- 先把一个大的Problem分解成多个可被同时处理的part
- 再把Part划分成一串离散的Instruction
- 每个Part把自己的Instruction交给各自的CPU进行处理,每个CPU同时处理不同的Part的Instruction
- 再加入一个统一控制机制对整个过程进行控制

- 分布式计算
分布式系统,是将自己的所有组件分散在不同的网络计算机上,这些计算机通过统一的消息机制来相互通讯和配合,分布在不同网络计算机上的组件相互协作,完成共同的目标。
优点:稀有资源可以共享,通过分布式计算可以在多台计算机上平衡计算负载,可以把程序放在最合适运行它的计算机上。
- 网格计算
定义:网格计算是利用广泛零散的计算资源完成一个共同的任务,它将本地网络或者互联网上零散的可用资源集合起来,是终端用户或者应用觉得他们在使用一台性能强悍的虚拟计算机。网格计算通常是以集群的方式实现
- 云计算
- 超大规模(私有云企业一般拥有成千上百台服务器)
- 虚拟化(底层资源进行虚拟化)
- 高可靠性(数据多副本容错)
- 通用性
- 高扩展性
- 按需服务
- 极其廉价
云计算的服务模式
- 公有云(自建他用)
- 私有云(自建自用)
- 混合云(包含两种云服务模式)
- 行业云(具体为某一行业的云服务)
虚拟化简介
虚拟化的本质:将原先的物理设备进行逻辑化分,转成一个文件夹或文件,实现软硬件的解耦
优点:资源利用率的提升,与硬件解耦,生命周期的提升(OS与硬件分离,由Hypervisor抽象成硬件资源形成VMM虚拟化层)。
计算虚拟化发展史
- 1972年 IBM正式将system370机的分时系统命名为虚拟机
- 2002年Xen虚拟化正式开源
- 2006年Qumranet正式对外宣布KVM诞生
- 2008年9月4日 Redhat出资1亿700万美金收购Qumranet
- 2010年11月,Redhat公司推出新的企业版Linux——RHLE6,集成了最新的KVM虚拟机,替换了RHLE5的Xen
- 2007年,HP推出了Integrity虚拟机
- 2008年,微软在windows Server 2008 R2中加入了Hyper-v
- 2008年 Linux推出了LXC(Linux Containers)第一套完整的Linux容器管理方案
- 2013年,Canonical有限公司推出了Docker项目
计算虚拟化的分类
- Ⅰ型虚拟化(裸金属虚拟化):Hypervisor直接调用硬件资源,不需要底层Host OS
- Ⅱ型虚拟化(宿主型虚拟化):Hypervisor(VMM)作为底层操作系统上的一个普通应用程序,通过创建虚拟机,共享底层物理服务器的资源。VMM调用Host OS服务来获得资源,采用该结构的虚拟化产品主要有(VMware Workstation,Virtual PC)
虚拟化的特点
- 分区:将虚拟资源分割,防止虚拟机超配额,每个虚拟机单独安装操作系统,彼此互不影响
- 隔离:各个虚拟机之间相互隔离,业务不受影响(同一台服务器在不通网的情况下,病毒不会在虚拟机之间相互传播)
- 封装:将整个虚拟机的资源以及状态,储存在独立于硬件的一组文件中。
- 独立:相对于硬件独立,虚拟机封装为文件后,虚拟机迁移时只需要将虚拟机设备文件以及配置文件或磁盘文件复制到另一台主机上运行即可,而不用关心底层硬件类型是否兼容。
计算虚拟化
- CPU虚拟化

CPU被分为4个环(Ring0/1/2/3),其中Ring0级别最高,之后123次之,Ring0的权限直接可以操作硬件,这样可以防止恶意软件随意调用硬件资源。
主机操作系统发出的指令分为两种
- 特权指令:用于操作和管理系统资源的指令,一般只有操作系统和驱动会允许有此权限,这些指令必须在Ring0级别运行
- 普通指令:所有应用程序都可以拥有此权限,这些普通指令在CPU普通权限级别Ring3就可以运行
- 敏感指令:修改虚拟机的运行模式或宿主机状态的指令,Guest OS中原本需要在Ring0模式下才能运行的特权指令剥夺特权后,交给VMM来执行的指令。
CPU虚拟化采用方法:“特权解除”、“陷入模拟”,也被称为经典虚拟化方式。
- 大型机-PowerPC架构,即精简指令集RISC:RISC架构的CPU指令集中,虚拟机特有的敏感指令是完全包含在特权指令中的。

- X86架构,即复杂指令集CISC:在CISC架构的CPU指令集的特权指令和敏感指令并不完全重合,基于x86的CISC指令集有19条敏感指令不属于特权指令的范畴,这部分敏感指令运行在CPU的Ring1用户态上。因此x86无法使用“解除特权”“陷入模拟”的经典虚拟化方式实现行x86架构的虚拟化。

所以,由此便产生了CPU的全虚拟化解决方案
- CPU的全虚拟化
定义:将所有虚拟机发出的操作,系统请求转发到虚拟机监听器(VMM),由VMM对虚拟机请求进行二进制翻译(Binary Translation),如果发现是特权指令或敏感指令,则要陷入到VMM模拟执行,然后调度到CPU特权级别上执行,如果只是应用程序指令则直接在CPU非特权级别上执行。
优点:不修改虚拟机操作系统,虚拟机可移植性和兼容性较强,支持广泛的操作系统。
缺点:运行时VMM修改Guest OS二进制代码,VMM性能损耗较大
- CPU的半虚拟化
定义:修改虚拟机操作系统Guest OS,让虚拟机操作系统能够意识到自己是被虚拟化的,虚拟机操作系统会发起“Hypercall”,超级调用Hypervisor层来替换虚拟化层中的敏感指令,从而实现虚拟化,而其他的应用程序等非敏感或非特权请求则直接在CPU非特权级别上运行
优点:半虚拟化中的GuestOS可以同时支持多个不同的操作系统,并提供与原始系统相近的性能
缺点:半虚拟化中的GuestOS只支持修改开源的操作系统,如Linux,而对于未开源的Windows系统,则无法实现半虚拟化,并且被修改过的虚拟机操作系统可移植性较差。
- CPU的硬件辅助虚拟化
定义:为CPU增加了新的执行模式——ROOT模式,可以让虚拟机监听器VMM运行在ROOT,ROOT模式位于CPU指令集Ring0下,特权指令和敏感指令自动在Hypervisor上执行
- 目前支持CPU硬件辅助的两种技术:Intel VT-x/AMD-v,这两种技术都为CPU增加了新执行模式——root模式.

- 内存虚拟化
在物理机使用内存地址空间时,必须满足两点要求
- 内存地址都是从物理地址0开始的
- 内存地址空间都是连续分配的
定义:把物理机的真实内存统一管理,包装成多份虚拟的内存给若干虚拟机使用,KVM通过内存虚拟化共享物理系统内存,动态分配给虚拟机
- GVA(Guest Virtual Address)虚拟机虚拟地址
- GPA(Guest Physical Address)虚拟机物理地址
- HVA(Host Virtual Address)宿主机虚拟地址
- HPA(Host Physical Address)宿主机物理地址

- 在KVM中,虚拟机的物理内存即为QEMU-kvm进程所占用的内存空间,KVM使用CPU辅助的内存虚拟化方式,在Intel平台,其内存虚拟化实现方式为EPT(Extend Page Tables)技术.

- 影子页表
定义:通过影子页表技术则可以实现客户机虚拟地址(GVA)到宿主机物理地址(HPA)的直接转换.
- EPT(Extended Page Tables,扩展页表):Intel的CPU提供EPT技术,直接在硬件上支持GVA—>GPA—>HPA的地址转换,从而降低内存虚拟化实现的复杂度,也进一步提升内存虚拟化性能.
- NPT(Nested Page Tables,嵌套页表):AMD提供的类似于EPT的技术.
- 透明大页
在此之前,需要了解到因为,X86架构的CPU默认使用的是4kb大小的内存页,同样也支持大小为2MB的大页(huge page).Linux2.6以上的内核都支持(huge page),在系统中使用大页,节约了页表所占用的内存数量.并且需要的地址转换页减少了,TLB缓存失效的次数也就减少了,从而提高了内存的访问性能,由于地址转换所需的信息一般保存在CPU的缓存中,大页的使用让地址转换信息减少,从而减少了CPU缓存的压力从而整体提高了系统的性能
- 大页
优点
- 页大小为2M
- 提高TLB命中率
- 减少访问内存时间
- 申请大内存区,效率更高
- 访问大内存区,减少页表项大小,提高CPU Cache(缓存)效率
- 透明
优点
- 对使用者完全透明,不依赖任何库,大小页混合
- 兼容ksm(Kernel Samepage Merging,内核相同页融合技术),swap(交换分区),需要共享或swap时拆分成4k大小页面
- 兼容EPT/NPT,兼容影子页表
- I/O虚拟化
- I/O的全虚拟化
定义:通过VMM为虚拟机模拟出一个与真实设备类似的虚拟I/O设备,当虚拟机对I/O设备发起请求时,VMM截获虚拟机下发的I/O访问请求,再由VMM将真实的访问请求发送到物理设备进行处理.
优点:虚拟机无论使用任何类型的操作系统,操作系统都不需要为I/O虚拟化做任何修改,就可以让多个虚拟机直接使用物理服务器的I/O设备.
缺点:VMM需要实时捕获每个虚拟机下发的I/O请求,截获请求后模拟到真实的I/O设备中,这些操作都是通过CPU运行软件程序来实现的,因此会给服务器带来严重的性能损耗.
- I/O的半虚拟化
定义:建立一个特权级别的虚拟机,要求各个虚拟机运行前端驱动程序,当需要访问I/O设备时虚拟机通过前端驱动把I/O请求发送给特权虚拟机,由特权虚拟机后端驱动收集每个虚拟机所发出的I/O请求,再由后端驱动对多个I/O请求分时分通道处理.特权虚拟机运行真实的物理I/O设备驱动,将I/O发送给物理I/O设备,I/O设备处理完后再将结果返回给虚拟机.
优点
- 减少VMM的性能损耗
缺点
- 需要修改虚拟机操作系统,改变操作系统对自身的I/O请求处理方式

- I/O的硬件辅助虚拟化
定义:将I/O设备驱动直接安装在虚拟机操作系统中,硬件直通与传统PC主机操作系统直接访问硬件是相同的.
优点
- 不需要对操作系统做任何的修改
- 虚拟机访问I/O硬件所需时间与传统PC机的访问时间相同.
主流的计算虚拟化
- 通过CPU虚拟化,内存虚拟化和I/O虚拟化,进行物理资源的复用,一台物理主机可以同时运行多台虚拟服务器,每个虚拟服务器又能承载不同的业务,从而提高硬件的利用率
- 云计算是为用户提供随时随地可获的IT服务,是一种商业模式或者服务模式,而虚拟化是一种技术手段,是云计算实现的重要手段之一.
开源的虚拟化
- KVM
- Xen
闭源虚拟化
- Hyper-v
- VMware的vSphere
- 华为的FusionSphere
KVM简介
- KVM,全称Kernel-based Virtual Machine(基于内核的虚拟机),是一种典型的Ⅱ型全虚拟化,KVM本身是一个Linux内核模块,当安装有Linux系统的物理机安装了这个模块后,就变成了Hypervisor,而且还不会影响原先在该linux上运行的其他应用程序,而且每个虚拟机都是进程,直接可以用Kill命令杀掉.
- 一个普通的Linux安装了KVM模块后,会增加三种运行模式
- Guest Mode:此模式是指虚拟机CPU、内存、磁盘等虚拟设备,该模式被置于一种受限的CPU模式下运行
- User Mode:用户空间,此模式下运行的主要是QEMU,它用来为虚拟机执行I/O类操作请求
- Kernel Mode:内核空间,此模式下可以真正操作硬件,当Guest OS执行I/O类操作或特权时,需要向用户模式提交请求,然后用户再次发起硬件请求给内核模模式,从而真操作硬件。
- KVM体系一般包括三部分:KVM内核模块、QEMU和工具管理,其中KVM内核模块和QEMU是KVM核心组件

- kvm.ko提供CPU与内存的虚拟化,QEMU-kvm提供的I/O虚拟化
- kvm核心模块与QEMU一起才能构建一个完整的虚拟化技术
- Libvirt:Libvirt是一个开源的管理工具,他可以管理各种虚拟化平台如KVM、Xen、VMware、Hyper-v,它是一套由C语言开发的API,各种语言例如java、python等可以通过Libvirt的API去管理各个虚拟化平台
- 在云计算中Hypervisor种类繁多,每个Hypervisor都有自己独特的管理工具,也没有统一的编程接口来对他们进行管理,所以Libvirt作为管理工具和Hypervisor的中间层向下对接各种Hypervisor,例如KVM、Xen等,向上可以提供各种语言的API。
- KVM实现I/O虚拟化的两种方式
现在我们都知道QEMU是一个实现I/O虚拟化的软件模拟工具,但是性能较差,例如现在要使用QEMU模拟一个windows虚拟机网卡,在系统上看该网卡速率仅为100M,当某些应用对网卡速率有要求的时候,就不能再使用QEMU了,此时就引入了一个新技术————Virtio
- 无virtio时的KVM的I/O虚拟化流程

- 虚拟机中的磁盘设备发起一次I/O操作请求
- KVM模块中的I/O Trap Code (I/O捕获程序)将这个I/O操作请求捕获到,进行相应的处理,然后将处理后的请求放到I/O共享页中
- KVM模块会通知QEMU,告诉它有新的I/O请求操作放到了共享页中
- QEMU收到通知后,到共享页中获取该I/O操作请求的具体信息
- QEMU对该请求进行模拟,同时根据I/O操作请求的信息调用运行在内核态的设备驱动,进行真正的I/O操作
- 通过设备驱动对物理硬件执行真正的I/O操作
- QEMU将执行后的结果返回到共享页中,同时通知KVM模块已完成此次I/O操作
- I/O捕获程序从共享页中读取返回的结果
- I/O捕获程序将操作结果返回给虚拟机
- 虚拟机将结果返回给发起操作的应用程序
- 使用Virtio时,具体的操作系统如下

- 同样是由虚拟机发起I/O操作请求
- 与使用默认模型不一样,这个I/O操作请求不会轻易经过I/O捕获程序,而是直接以前后端的形式放到环形缓冲区,同时KVM模块通知后端驱动
- QEMU到环形缓冲区获取到操作请求的具体信息
- 后端驱动直接调用真实的物理设备驱动进行具体的I/O操作
- 由真实的设备驱动完成I/O操作
- QEMU将处理结果返回到环形缓冲区,并由KVM模块通知前后端驱动
- 前端驱动从环形缓冲区获取到此次I/O操作的结果
- 前端驱动将结果返回给发起操作的应用程序
Virtio
优点:节省QEMU模拟时所需的硬件资源,缩短I/O请求的路径,提高虚拟化设备的性能
缺点:有些老设备或者不常用的设备,无法使用Virtio,只能使用QEMU方式进行模拟
FusionCompute简介
- FusionCompute:华为自研虚拟化软件,实现计算资源,存储资源,网络资源的虚拟化,通过统一的接口,对这些虚拟资源进行集中的调度和管理
- 价值
- 帮助客户提升数据中心基础设施的资源利用率
- 帮助客户成倍缩短业务上线周期
- 帮助客户成倍降低数据中心能耗
- 利用虚拟化基础设施的高可用和恢复能力,实现业务自动化故障恢复,降低数据中心成本,增加系统应用的正常运行时间
- 构成
VRM(Vritual Resource Manager)虚拟资源管理器
- 管理集群内的块存储资源
- 管理集群内的网络资源
- 管理集群内虚拟机生命周期以及虚拟机在计算节点上的分布和迁移
- 管理集群内资源的动态调度
- 通过对虚拟资源、用户数据的统一管理,对外提供弹性计算、存储、IP等服务
- 通过提供统一的操作维护管理接口,操作维护人员通过WebUI远程访问.FusionCompute,对整个系统进行操作维护,包含资源管理、资源监控、资源报表等
CNA(Compute Node Agent)计算节点代理
- 提供虚拟计算功能
- 管理计算节点上的虚拟机
- 管理计算节点上的计算、存储、网络资源
