CPU虚拟化

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    虚拟化概念

    Qemu-KVM虚拟机

    – 核心由QemuKVM两部分组成Qemu本身是一个独立的虚拟机

    软件运行在OS的用户态KVM是Linux的内核模块利用CPU

    硬件虚拟化特性对CPU和内存虚拟化进行加速

    Libvirt是对KVM虚拟机进行管理的工具和应用编程接口

    Virsh是Linux下管理KVM虚拟机的命令行接口它基于libvirt API

    工作

    Virt-manager是一个Linux上的GUI程序实现对KVM虚拟机的图

    形化管理也是基于libvirt API工作

    ** Libvirt API所管理的主要对象**

    CPU虚拟化请添加图片描述

    术语表

    • 虚拟机、客户机Guest、VM

    • Hypervisor、VMMVirtual Machine Monitor、虚拟机监视器

    • 根模式root mode、非根模式non-root mode

    • GDT全局描述符表

    • LDT局部描述符表

    • IDT中断描述符表

    临界指令问题

    VMM需要满足以下条件

    1. 等价性
      • 应用程序在VMM上的虚拟机执行英语物理硬件上执行的行为相同。
    2. 资源控制
      • 物理硬件有VMM全权控制VM及VM上的应用程序不能直接访问硬件
    3. 执行效率
      • 在虚拟机环境中应用程序的绝大多数指令能够在VMM不干预的情况下直接在物理硬件上执行。
    4. 指令集满足约束
      • 所有敏感指令都是特权指令

    CPU特权级

    OS内核的代码运行在最高运行级别ring0上可以使用特权指令控制终端修改页表和访问设备等等。应用程序的代码运行在最低运行级别ring3上不能做受控操作。

    应用程序访问系统资源的时候需要进行用户态到内核态的切换。

    Trap&Emulation

    • 基本思想接触OS的特权指令十七运行在Ring1 或者Ring3下将VMM运行在Ring0下OS和应用程序中的非特权指令直接运行在物理CPU上。
    • OS使用的特权指令在执行时会产生General Protection Fault进而会被VMM的异常处理程序捕获捕获后由VMM模拟特权指令的执行之后再返回到OS执行客户机的下一条指令

    遇到的挑战

    • 特权指令
    • 敏感指令读写时钟寄存器、中断寄存器、访问存储保护系统、地址重定位系统以及所有的I/O指令这些指令可以在非最高特权级执行。

    临界指令

    CPU虚拟化实现方式–BT+DE

    全局虚拟化

    • Guest OS不知道自己运行在虚拟机环境中也不要需要修改
    • VMM捕获并处理所有特权和敏感指令序列二非特权指令则不修改直接运行在宿主CPU上。
    • 全虚拟化能够提供最佳的隔离性和安全性
    • 软件方式“Binary Translation”+“Direct Execution” VMware
    • 硬件辅助虚拟化Intel VT-x、AMD-VKVM

    半虚拟化

    • 修改Guest OS十七运行在较低特权级调用Hypercall主动请求VMM代理器执行特权操作。
    1. 二进制翻译

      • Guest操作系统内核代码经过动态二进制翻译后在宿主机CPU的Ring 1特权级下执行

      • 动态扫描Guest OS代码在需要VMM介入的地方插入trap进而可以由VMM接管特权指令或敏感指令的模拟执行

    2. 直接执行

      • Guest用户模式非特权指令直接在宿主机CPU Ring 3特权级下执行

    CPU实现方式–半虚拟化

    • 主要思想通过修改Guest OS来解决X86架构下的临界指令问题同时提升虚拟机的性能

    • 不改变应用程序二进制接口Application Binary Interface, ABI因此应用程序不需要修改和重新编译

    • 适合于开源操作系统Linux、FreeBSD但很难支持闭源操作系统如Windows

    • 特权指令、敏感指令相关的操作被转换为发送给VMM的Hypercall超级调用由VMM继续进行处理

    典型的半虚拟化系统–XEN请添加图片描述

    • Xen位于操作系统和硬件之间(Ring 0)负责为上层运行的客户机操作系统内核(Ring 1)提供虚拟化的硬件资源负责管理和分配这些资源并确保上层虚拟机称为域Domain之间的相互隔离

    • Xen设置了一个特权域用以辅助Xen管理其他的域并提供虚拟的I/O资源代理服务该特权域称为Domain 0而其余的域则称为Domain U

    • 只有运行在Ring 1的代码Guest OS才能向Xen发送Hypercall请求以防止应用程序运行在Ring 3的错误调用导致对系统的破坏

    • 在32 位X86架构下Hypercall通过int0x82陷阱(Trap)指令实现因为传统操作系统本身并不使用int0x82 (Linux 使用int 0x80 作为系统调用指令int 0x82 并未使用)。在 64 位的X86上是 syscall真正的IDT被设置以至于这只会从Ring 1 中所产生中断Xen Hypervisor不负责处理网络和磁盘等I/O请求因此半虚拟化客户机Domain U PV必须通过Xen Hypervisor与Domain 0进 行通信从而完成I/O操作请求

    Xen VCPU调度

    1. 物理CPU信息
      • 当前物理CPU上运行的VCPU
      • 当物理CPU空闲时运行的idle VCPU
      • 调度计时器对当前运行的VCPU即使当时间片到期时会触发物理CPU进行调度
    2. VCPU有4种状态
      • RUNSTATE_RUNNINGVCPU此时正运行在物理CPU上
      • RUNSTATE_RUNNABLEVCPU目前处于可运行状态但尚未被调度到物理CPU上
      • RUNSTATE_BLOCKEDVCPU处于阻塞状态
      • RUNSTATE_OFFLINE特殊的不可执行状态在VCPU睡眠或暂停的时候将处于该状态

    Xen VCPU调度

    • BVT算法Borrowed Virtual Time是一种公平性优先的调度算法
    • Credit算法让每一个VCPU都可以公平地使用物理CPU的资源
    • Sedf算法Simple Earliest Deadline First最早截止日期优先调度算法可以根据每个VCPU负载的大小动态的调整VCPU的优先级
    • Xen调度算法是以VCPU为单位进行调度的而不是以Domain为单位。
      请添加图片描述
    1. VCPU上的线程调度
    2. 物理CPU上的VCPU调度

    Xen VCPU调度----Credit算法

    • 根绝权重比例分享CPU的基于时间片的多级队列轮转调度算法。
    • 算法为每一个Domain U设置了两个参数
      • Weight表示domain的权重系统中各个domain的Weight比值决定了它们各自占用CPU的时间比例
      • CAP表示domain可占用的最多物理CPU的比例时间比如CAP=50表示该domain只能占用半个物理CPU的时间CAP=100表示能占用1个物理CPU的时间
    • 每一个物理CPU上维护一个VCPU调度队列队列中的VCPU分为3个优先级从低到高依次为OVER、UNDER、BOOST。优先级高的VCPU排列队列前边低的排在后边
    • UNDER级别和OVER级别依据VCPU的Credit值进行区分Credit>0为UNDERCredit<0为OVER
    • Credit值根据domain的Weight值计算

    具体步骤

    1. 初始时所有VCPU都处在UNDER级别
    2. 算法每隔10ms对当前运行的VCPU进行一次调整将其Credit值减去100
    3. 每隔30ms算法根据系统中各个domain的Weight值重新计算各个domain中每个VCPU的Credit值Credit值大于0的则设置为UNDER级小于0的则设置为OVER级
    4. VCPU在执行I/O请求的过程中会因为等待domain 0处理的事件而进入BLOCK状态当等待的事件处理完成后domain 0通过事件通道唤醒该VCPU此时为了降低该VCPU的响应时间将此VCPU设置为BOOST级别并插入到队列中相应优先级的尾部。
    5. 如果当前物理CPU上正在运行低于BOOST级的VCPU该BOOST级VCPU就会抢占物理CPU如果当前运行的VCPU同样为BOOST级别则刚被唤醒的VCPU需要在队列中等待被调度
    6. BOOST级别是一个临时的状态算法会每隔10ms判断一个VCPU是否处于BOOST级如果是则将其调整为UNDER级因此VCPU在BOOST级最多持续10ms
    7. 算法对系统中所有的VCPU采用同样的时间片进行调度无论VCPU处于什么样的级别

    请添加图片描述

    • 系统总的Credit=每个物理CPU能分配的Credit预定义 * 物理 CPU个数

    • 根据当前活跃的domain之间的weight比例来计算能够分配给 domain的Creditcredit_fair

    • 计算domain能够得到的Credit上限即让其每个VCPU独占一个物 理CPU的情况下能够获得Creditcredit_peak

    • 根据domain的CAP来计算domain能够获得的Credit的上限 credit_cap

    • 当creadit_cap < credit_peakcredit_peak=credit_cap最后在 credit_peak和credit_fair里面取最小值作为domain的credit

    • 最后把domain的credit除以当前domain活动的VCPU数就变 成domain的每个VCPU的credit再根据credit值来设置VCPU所处 的级别

    硬件辅助的CPU虚拟化

    KVM VCPU 工作原理

    KVM虚拟机线程模型

    VCPU

    • VCPU的整个生命周期都在Qemu线程的上下文中在Kernelroot模式、Userroot模式、Guestnon-root模式三种模式下转换

      请添加图片描述

    1. 客户模式Guest Mode运行GuestOS执行Guest非IO操作指令。
    2. 用户模式User Mode运行QEMU实现IO模拟与管理。
    3. 内核模式Kernel Mode运行KVM内核实现模式的切换VM Exit/VM Entry执行特权与敏感指令。
    • 每个VCPU对应一个Qemu线程在Linux上以普通线程进行调度
      请添加图片描述
  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6