使用虚拟 CPU
- 7 分钟
如前文所述,虚拟 CPU (vCPU) 充当物理 CPU (pCPU) 的代理。 换句话说,vCPU 是来宾 OS 的 pCPU(即 VM 上运行的 OS)的表示形式。 可以在 VM 中启动 vCPU,并通过虚拟机监控程序映射到基础 pCPU。 原则上,一个 VM 可以有一个或多个 vCPU。 例如,VMware ESX 4 中的 VM 最多可以有 8 个 vCPU。 vCPU 的数量表示 VM 的宽度。 宽度大于 1 的 VM 称为对称多处理 (SMP) VM。 相反,宽度等于 1 的 VM 称为单处理器 (UP) VM。 以下视频详细讨论多处理器 VM:
下图演示了一个宽度为四的 SMP 本机系统 VM 和一个 UP 本机系统 VM,两者均在同一硬件上运行。
图 6:一个宽度为四的 SMP 本机系统 VM 和一个 UP 本机系统 VM,两者均在同一硬件上运行
类似于常规用途 OS 上的进程,vCPU 可以处于不同的状态,例如正在运行、就绪和等待状态。 在某个时间点,虚拟机监控程序只能在单个内核上调度 vCPU(类似于在内核上调度 OS 进程)。 例如,在配备两个 Xeon 5405 处理器的主机上运行的 UP VM(即共 8 个 pCPU)将仅在八个可用内核中的一个内核上运行。 本质上并行的工作负载(例如 MapReduce 应用程序)首选 SMP VM。 接下来,我们将讨论虚拟机监控程序如何在 pCPU 上调度 vCPU。
虚拟 CPU 调度和 Xen 调度算法
常规用途 OS 支持两个级别的调度:进程调度和线程调度。 借助虚拟机监控程序,可添加一个额外级别的调度,即 vCPU 调度。 虚拟机监控程序在基础 pCPU 上调度 vCPU,从而为每个来宾 VM 提供基础物理处理时间的一部分。
我们(简要)讨论了以下两个 Xen 热门调度算法:简单最早截止日期优先 (SEDF) 和 Credit 调度算法 (CS)。 顾名思义,SEDF 很简单,只涉及两个参数 n(切片)和 m(周期)。 VM(或在 Xen 中称为域 Ui)可以为每个 m 请求 n。 SEDF 可按照 n 和 m 计算的每个 vCPU 指定一个截止时间。 截止时间定义为运行域以赶上其截止时间的最晚时间。 例如,域 Ui 可以请求 n = 10 毫秒,m = 100 毫秒。 因此,SEDF 可将此域中的 vCPU 调度到最迟 90 毫秒到 100 毫秒的周期,但仍赶上其截止时间。 SEDF 的操作方式是在队列中保存的所有可运行的 vCPU 集中进行搜索,然后选择具有最早截止时间的那个。
Xen 的 CS 比 SEDF 更复杂。 首先,在配置 VM 时,会对 VM 中的每个 vCPU 设置两个属性:权重和上限。 权重确定应提供给 vCPU 的 pCPU 容量的份额。 例如,如果将两个 vCPU(vCPU-1 和 vCPU-2)的权重分别指定为 256(默认值)和 128,则 vCPU-1 获取的份额是 vCPU 2 的两倍。 权重的范围可以介于 1 到 65,535 之间。 上限确定应提供给 vCPU 的 pCPU 的总百分比。 上限可以修改权重的行为。 尽管如此,vCPU 也可以为无上限。
CS 将每个 vCPU 的权重转换为信用额度。 只要 vCPU 的信用额度正在运行,就会将其扣除。 vCPU 的信用额度用完后,就会将其标记为“over”,否则标记为“under”。 CS 维护每个 pCPU 的队列(假设是一个芯片多处理器的体系结构),并首先存储所有状态为 under 的 vCPU,然后存储所有状态为 over 的 vCPU。 CS 的工作方式是选择队列中的第一个状态为 under 的 vCPU来运行。 CS 跟踪每个 vCPU 的信用额度,切换 vCPU 时,它会将其置于适当类别结尾的队列中。 最后,CS 允许没有状态为 under 的 vCPU 从其他 pCPU 的队列中拉取状态为 under 的 vCPU,来应用负载均衡。 有关 SEDF 和 CS 的更多详细信息,请参阅 Chisnall 的 Xen 虚拟机监控程序权威指南1。
Xen 是一个开放源代码虚拟机监控程序。 因此,可以设计并添加自己的调度算法。 Chisnall 全面介绍了 Xen 内部机制,还提供了向 Xen 添加新调度算法的分步说明。
参考资料
- 大卫·奇斯纳尔(2007年)。 Xen 虚拟机监控程序的明确指南 Prentice Hall