目录
vCPU的概念
vCPU和CPU的关系
CPU的Ring级别
CPU虚拟化技术
软件辅助全虚拟化
半虚拟化
硬件辅助虚拟化
计算资源的虚拟化可以分为CPU虚拟化、内存虚拟化、I/O虚拟化三个方面
CPU虚拟化:多个虚拟机共享CPU资源,对虚拟机中的敏感指令进行截获并模拟执行
内存虚拟化:多个虚拟机共享同一物理内存,需要相互隔离
I/O设备虚拟化:多个虚拟机共享一个物理设备
vCPU的概念
vCPU和CPU的关系
vCPU和物理CPU的关系
一个物理CPU有多个内核,每个内核可以有多个线程
如果物理CPU没有超线程技术
一个内核同时只能处理一个任务
即一个内核对应一个vCPU,将一个内核虚拟为一个vCPU,为虚拟机提供CPU资源
如果物理CPU有超线程技术
一个内核若有两个线程,就可以同时处理2个任务
即一个线程对应一个vCPU,将一个线程虚拟为一个vCPU,为虚拟机提供CPU资源
综上可知:多台虚拟机之间可以复用同一个物理CPU
vCPU的分配
虚拟CPU分配给虚拟机时,虚拟CPU的数量不能超过单台物理节点所能提供的vCPU数量
即:虚拟机分配的CPU总量不能超过单台物理节点所能提供的vCPU数量
分配规则
为虚拟机分配CPU初始值,该初始值应考虑该虚拟机在物理机运行所需的配置(在物理机运行需要多少cpu资源,虚拟机就分配多少cpu资源)
观察该虚拟机使用资源的均值和峰值(2个星期左右),然后再修改CPU的分配数量,得到资源利用最大化(修改后的CPU尽量保证虚拟机的均值控制在50~70%,峰值控制在50~90%之间)
CPU的Ring级别
CPU 指令分级
现代计算机的CPU技术有个核心的特点,就是根据指令的敏感程度分为不同的权限级别来实现运行的,避免了用户与应用程序层面的错误导致整个系统的崩溃;不同类型的CPU会分为不同的权限级别,不过总体的思想是一致的,以下我们主要通过x86的CPU作为代表来讲解CPU的虚拟化
x86 物理CPU的权限分级
x86 CPU分为4个级别,分别为Ring0、Ring1、Ring2、Ring3
Ring0级别(内核态)
直接作用于操作系统内核,给系统核心命令使用的权限,调用系统资源,优先级最高;可以访问内存的所有数据
Ring1-2级别
用于操作系统服务(设备驱动程序)
Ring3级别(用户态)
应用程序APP使用的权限,优先级最低;只能受限的访问内存,并且CPU资源可以被其他程序获取
我们重点关注的是Ring0(内核态)与Ring3(用户态)
每一层只能访问本层以及权限更底层的数据,当用户态直接执行Ring0权限的指令时,会被系统显示为非法指令,会报错,这种操作可能会导致系统出错
物理机操作系统中的用户态如何实现访问内核态呢
当APP需要执行访问磁盘、写文件等操作时,APP需要通过执行系统调用函数,在执行系统调用时CPU的运行级别就会从Ring3切换到Ring0,并跳转到系统调用对应的内核代码位置来进行相关操作,相关操作执行完成之后,从Ring0返回到Ring3,实现用户态与内核态的切换
CPU的指令类型
特权指令
只用于操作和管理关键系统资源的指令,必须在Ring0权限级别上才能运行的指令(可能会有部分特权指令存在于Ring1的权限)
普通指令
在CPU普通权限级别上就可以运行,即在Ring3级别上运行的指令(Ring1-2也属于用户态)
敏感指令
在虚拟化环境下的特殊指令被称为敏感指令
敏感指令指的是修改虚拟机的运行模式或宿主机状态的指令,也就是说是将Guest OS中原本需要在Ring 0模式下才能运行的特权指令剥夺特权后,交给VMM所执行的指令
CPU虚拟化技术
虚拟化架构知识:
Ring0不允许出现在多个操作系统同时运行的时候,因为宿主操作系统工作在Ring0,虚拟机操作系统就不能运行在Ring0,而当客户操作系统执行特权指令时就会发现错误
为了解决以上问题,提出了软件辅助全虚拟化、半虚拟化、硬件辅助全虚拟化三种解决方法
不论是哪种虚拟化技术,关于虚拟机特权指令的操作都要交给VMM,由VMM交给底层硬件,不同的虚拟化技术只是说VMM交给底层硬件的方式不同
| 软件辅助全虚拟化 | 半虚拟化 | 硬件虚拟化 |
实现技术 | 通过二进制转换、翻译实现 | 通过超级调用Hypercall实现 | 通过将特权指令转到Root模式实现 |
应用厂商 | Vmware Workstation | Xen | Vmware ESXi/Hyper-v/KVM/Xen 3.0 |
性能 | 差 | 最好,几乎与物理主机性能相同 | CPU需要在两种模式切换,带来额外开销 |
兼容性 | 最佳兼容性 | 需要修改操作系统,兼容性差 | 最佳兼容性 |
软件辅助全虚拟化
使用VMM在底层硬件和服务器之间建立一个抽象层,将物理资源全部抽象化(即针对与虚拟机的所有的底层硬件都是由VMM模拟实现的),不过虚拟机会认为自己是在真实的主机上运行的,而VMM就是虚拟机访问物理层的接口
实现的原理
VMM运行在最高权限等级,Guest OS的特权指令等操作交由VMM代为完成
即:将虚拟机运行的特权指令进行捕获、翻译,使之成为只能对虚拟机生效的虚拟特权指令,软件拦截使得性能开销大
提供两种工作机制(特权解除、陷入模拟)
特权解触(优先级压缩)
虚拟机执行Ring0指令时,将指令发到VMM时会触发VMM异常,这些异常就被VMM捕获,再由VMM将这些特权指令进行虚拟化成为只针对虚拟CPU起作用的虚拟特权指令
本质为使用能运行在物理机用户态中的非特权指令模拟出只对虚拟机有效的虚拟特权指令,实现特权指令的降级
存在的问题:有一部分特权指令会存在于Ring1权限中,而Ring1指令并不会触发VMM的异常捕获,从而导致在虚拟机中执行的特权指令直接对物理机造成了影响,可能导致系统出现故障
陷入模拟(二进制模拟—使用较多)
VMM会对虚拟机传来的指令的二进制代码进行扫描,一旦发现执行的是特权指令时,会将这些二进制代码翻译成虚拟特权指令的二进制代码或者是翻译成运行在核心态中的特权指令二进制代码从而强制的触发异常
这种方案就解决了虚拟机运行Ring1指令时没有被VMM捕获的问题
半虚拟化
实现的原理
通过对Guest OS的内核代码进行一定的修改,将原来在Host OS上执行的一些特权指令修改成可以和VMM直接交互的方式(即将虚拟机对特权指令的调用改为对直接对VMM的调用-这种调用方式为Hypercall),由VMM直接将特权指令传递给物理机,这样就不会有捕获异常、翻译等过程,性能损耗比较少;不过需要给虚拟机操作系统打补丁,并且虚拟机系统的镜像文件并不通用
此时虚拟机知道自己是运行在虚拟环境中,并不是运行在真正的物理主机上
硬件辅助虚拟化
通过此方式就形成了新的执行态(Root态和非Root)
Root与非Root操作模式将原有的CPU操作区分为VMM所在的Root操作区和虚拟机所在的非Root操作区,每个操作区都拥有Ring0-3的所有指令级别;通过这种新的执行态,使得VMM和Guest OS被完全隔离
实现原理
硬件辅助虚拟化是使用了支持虚拟化功能的CPU进行支撑(Inter-TV和AMD-V技术就可以使得CPU支持虚拟化),虚拟机运行在非Root态的核心态中,可以直接调用特权指令,不过其调用特权指令是通过硬件的虚拟化机制将特权指令调用转到处在根模式下的VMM中,由VMM完成对硬件的同一管理
CPU厂商支持虚拟化的力度在不断加大,靠着硬件辅助的虚拟化技术性能逐渐逼近半虚拟化,再加上该虚拟化不需要修改客户端操作系统的优势,该虚拟方式是未来的发展趋势(目前很多的服务器/CPU 上面都可以开启硬件辅助虚拟化)