本文介绍 Windows Server 和 Windows 中的虚拟处理器计划逻辑模式。 这些模式或调度程序类型确定了 Hyper-V 虚拟机监控程序如何跨来宾虚拟处理器分配和管理工作。 Hyper-V 主机管理员可以:
- 选择最适合来宾虚拟机 (VM) 的虚拟机监控程序调度程序类型。
- 配置 VM 以利用调度逻辑。
背景
在考虑 Hyper-V 虚拟处理器计划背后的逻辑和控制之前,请务必了解某些概念,例如同时进行多线程处理(SMT),以及 Hyper-V 虚拟化处理器的方式。
了解 SMT
SMT 是新式处理器设计中的一种技术,它为单独的独立执行线程提供了共享处理器资源的方法。 SMT 通常为工作负荷提供适度的性能提升。 它会尽可能地并行化计算,增加指令吞吐量。 但是,当线程相互争用共享处理器资源时,有时性能没有明显改善。 甚至性能可能会略有下降。
若要将 SMT 与 Windows Server 配合使用,必须具有兼容的处理器。 具有 Intel Hyper-Threading 技术(Intel HT 技术)或高级微设备 (AMD) SMT 的处理器是兼容处理器的示例。
在本文中,对 SMT 的描述以及 Hyper-V 使用它的方式同样适用于 Intel 和 AMD 系统。
- 有关 Intel HT 技术的详细信息,请参阅 Intel 超线程技术。
- 有关 AMD SMT 的详细信息,请参阅 AMD“Zen”核心体系结构。
了解 Hyper-V 如何虚拟化处理器
在考虑虚拟机监控程序调度程序类型之前,应了解 Hyper-V 体系结构。 有关此体系结构工作原理的详细摘要,请参阅 Hyper-V 技术概述。 目前,请记住以下概念:
Hyper-V 在虚拟机监控程序的控制下创建和管理 VM 分区,在分区之间分配和共享计算资源。 分区在所有来宾 VM 之间以及来宾 VM 与根分区之间提供强隔离边界。
根分区本身是 VM 分区,尽管它具有独特的属性和相比来宾 VM 更高的特权。 根分区:
- 提供用于控制所有来宾 VM 的管理服务。
- 为来宾提供虚拟设备支持。
- 管理来宾 VM 的所有设备输入和输出。
建议不要在根分区中运行任何应用程序工作负载。
根分区的虚拟处理器和基础逻辑处理器之间存在一对一映射。 主机虚拟处理器始终在同一基础逻辑处理器上运行。 没有根分区虚拟处理器的迁移。
默认情况下,托管根分区虚拟处理器的逻辑处理器还可以运行来宾虚拟处理器。
虚拟机监控程序可以将来宾虚拟处理器安排为在任意可用的逻辑处理器上运行。 虚拟机监控程序调度器在调度来宾虚拟处理器时尝试考虑时间缓存局部性、非统一内存访问(NUMA)拓扑以及其他多个因素。 但最终,虚拟处理器可以被调度到任何主机的逻辑处理器上。
虚拟机监控程序调度程序类型
Hyper-V 虚拟机监控程序支持多种计划程序逻辑模式,这些模式确定虚拟机监控程序如何计划基础逻辑处理器上的虚拟处理器。 这些调度程序类型为:
经典调度程序
经典计划程序是早于 Windows Server 2019 的所有版本的 Hyper-V 使用的默认计划程序。 经典调度程序为来宾虚拟处理器提供公平、抢先式的轮循调度模式。
经典计划程序类型适用于大多数传统的 Hyper-V 使用,例如私有云、托管提供商等。 经典计划程序类型的性能特征经过优化,以支持各种虚拟化方案,例如:
- 将虚拟处理器超额分配给逻辑处理器。
- 同时运行许多异类 VM 和工作负载。
- 运行更大规模的高性能虚拟机。
- 不受限制地支持 Hyper-V 的完整功能集和其他方案。
核心调度程序
虚拟机管理程序核心调度程序是经典调度机制的替代。 核心计划程序从 Windows Server 2016 和 Windows 10 版本 1607 开始可用。 核心调度程序为来宾工作负载隔离提供了强大的安全边界。 它还减少了在启用了 SMT 的虚拟化主机上运行的 VM 中的工作负荷的性能可变性。 核心调度程序支持在同一启用 SMT 的虚拟化主机上同时运行 SMT 和非 SMT VM。
核心调度程序:
- 使用虚拟化主机的 SMT 拓扑。
- (可选)向来宾 VM 公开 SMT 对。
- 将同一 VM 中的来宾虚拟处理器组调度到 SMT 逻辑处理器组。
这项工作是对称发生的。 如果逻辑处理器分为两组,则虚拟处理器按两组进行计划,并且永远不会在 VM 之间共享核心。 为未启用 SMT 的 VM 计划虚拟处理器时,该虚拟处理器在运行时会占用整个核心。 使用核心计划程序时:
- 它为来宾工作负荷隔离创建强大的安全边界。 客户虚拟处理器只能在基础物理核心对上运行,以减少受到旁通道窃听攻击的风险。
- 它减少了吞吐量的可变性。
- 这可能会降低性能。 如果在一个组中只有一个虚拟处理器可以运行,则核心中启动的只会有一个指令流。 另一个处于空闲状态。
- 来宾 VM 中运行的作系统(OS)和应用程序可以使用 SMT 行为和编程接口(API)来控制和分发跨 SMT 线程的工作,就像使用物理计算机一样。
从 Windows Server 2019 起,Hyper-V 默认使用核心调度程序。 在早期版本(如 Windows Server 2016)中,核心计划程序是可选的,经典计划程序是默认计划程序。
禁用主机 SMT 时的核心调度程序行为
在某些情况下,可以将虚拟机监控程序配置为使用核心调度程序类型,但 SMT 功能已禁用或不存在于虚拟化主机上。 在这些情况下,无论虚拟机监控程序调度程序类型设置如何,都会使用经典调度程序行为。
根调度程序
根调度程序是随 Windows 10 1803 版本而来的。 启用根调度程序类型时,虚拟机监控程序会提供工作调度的根分区控制。 在根分区 OS 实例中,NT 计划程序管理分配给系统逻辑处理器的工作的各个方面。
根调度程序解决了支持实用工具分区并提供强工作负载隔离的独特要求,与 Windows Defender 应用程序防护 (WDAG) 一起使用。 在这种情况下,将调度责任留给根 OS 可带来多种优势:
- 可以使用适用于容器方案的 CPU 资源控制和实用工具分区,从而简化管理和部署。
- 根 OS 调度程序可以轻松地收集容器中工作负载 CPU 使用情况的指标。 它可以将此数据用作计划策略的输入,并将其应用于系统中的所有其他工作负荷。
- 这些相同的指标还有助于将应用程序容器中完成的工作归因于主机系统。 对于传统的 VM 工作负载,跟踪这些指标更加困难,其中一些代表所有运行的 VM 的工作在根分区中发生。
在客户端系统上使用根调度程序
从 Windows 10 版本 1803 开始,根调度程序默认仅在客户端系统上使用,这意味着:
- 可以让虚拟机监控程序支持基于虚拟化的安全性和 WDAG 工作负载隔离。
- 必须正确运行具有异类核心体系结构的未来系统。
此配置是客户端系统唯一支持的虚拟机监控程序调度程序配置。 管理员不应尝试替代 Windows 客户端系统上的默认虚拟机监控程序调度程序类型。
VM CPU 资源控制和根调度器
启用 Hyper-V 虚拟机监控程序的根调度器后,将不再支持 Hyper-V 虚拟机监控程序在每个虚拟机处理器上使用的资源控制。 在根 OS 上,计划程序逻辑会全局管理主机资源,并且不管理单个 VM 的来宾资源。 仅当虚拟机监控程序直接控制虚拟处理器调度时(例如,使用经典和核心调度程序类型进行控制),Hyper-V 的按 VM 处理器资源控制(例如上限、权重和预留)才适用。
在服务器系统上使用根调度程序
不建议在服务器上将根调度程序与 Hyper-V 配合使用。 其性能特征尚未完全特征化并经过优化,以适应许多服务器虚拟化部署的典型工作负荷范围。
在来宾 VM 中启用 SMT
将虚拟化主机的虚拟机监控程序配置为使用核心调度程序类型后,还可以将来宾 VM 配置为使用 SMT。 具体而言,可以指定要向来宾 VM 公开的虚拟 SMT 线程数。 然后,客户操作系统调度程序和虚拟机工作负载可以在自己的工作调度中检测并使用 SMT 拓扑。
- 在 Windows Server 2016 中,默认情况下未配置来宾 SMT。 Hyper-V 主机管理员必须显式启用它。
- 在 Windows Server 2019 及更高版本中,在主机上创建的新 VM 默认继承主机 SMT 拓扑。 例如,在具有每个核心两个 SMT 线程的主机上创建的版本 9.0 VM 也具有每个核心的两个 SMT 线程。
必须使用 PowerShell 在来宾 VM 中启用 SMT。 Hyper-V 管理器中不提供任何用户界面。 若要在来宾 VM 中启用 SMT,请执行以下操作:
使用属于 Hyper-V 管理员或等效组成员的帐户打开 PowerShell 窗口。
运行
Set-VMProcessor -VMName <VM-name> -HwThreadCountPerCore <n>
,其中<n>
是来宾 VM 看到的每核心 SMT 线程数。 如果对<n>
使用0
值,则HwThreadCountPerCore
值将设置为主机的每个核心的 SMT 线程计数。注意
Windows Server 2016 不支持将
HwThreadCountPerCore
设置为0
.
以下屏幕截图显示了从 VM 中运行的来宾 OS 获取的系统信息。 有两个虚拟处理器,并且已启用 SMT。 客户操作系统检测到属于同一核心的两个逻辑处理器。
配置虚拟机监控程序调度程序类型
默认情况下 Hyper-V 使用的虚拟机监控程序计划程序的类型取决于 OS 版本。 无论哪个计划程序是 OS 上的默认计划程序,都可以将虚拟机监控程序配置为使用核心计划程序。 核心调度器通过限制来宾虚拟处理器在相应的物理 SMT 对上运行来提高安全性。 此配置支持对来宾虚拟处理器使用具有 SMT 调度的 VM。
注意
在 Windows Server 2016 上,Hyper-V 默认使用经典计划程序。 如果在 Windows Server 2016 或更高版本上使用 Hyper-V,建议选择核心计划程序。 进行此转换可确保虚拟化主机得到最佳保护,以防潜在的恶意来宾虚拟机。
考虑对安全性和性能的影响
为了帮助确保 Hyper-V 主机部署在最佳安全配置中,Hyper-V 从 Windows Server 2019 起默认采用核心虚拟机监控调度模型。 主机管理员可以选择将主机配置为使用传统的经典调度程序。 在重写默认设置之前,管理员应仔细阅读、了解和考虑每个计划程序类型对虚拟化主机的安全性和性能的影响。 有关详细信息,请参阅关于 Hyper-V 虚拟机监控程序调度程序类型的选择。
在 Windows Server 上选择虚拟机监控程序调度程序类型
虚拟机监控程序调度程序配置由 hypervisorschedulertype
引导配置数据 (BCD) 条目控制。
选择调度程序类型:
使用管理员权限打开命令提示符。
Enter
bcdedit /set hypervisorschedulertype <type>
,其中<type>
具有以下选项之一:Classic
Core
Root
您必须重启系统,以便您对虚拟机监控程序调度器类型所做的任何更改生效。
注意
Windows Server 上的 Hyper-V 目前不支持虚拟机监控程序根调度程序。 Hyper-V 管理员不应尝试为服务器虚拟化方案配置根调度程序。
确定当前调度程序类型
可以通过检查 Windows 系统日志来确定 Hyper-V 当前正在使用的虚拟机管理程序调度程序类型。 查找 ID 为 2 的最新虚拟机监控程序启动事件。 该事件报告在虚拟机监控程序启动时所配置的虚拟机监控程序调度程序类型。 可用于虚拟机监控程序调度程序类型的值如下:
价值 | 调度器类型 |
---|---|
1 | 经典调度程序,已禁用 SMT |
2 | 经典调度器 |
3 | 核心调度器 |
4 | 根调度程序 |
可以使用事件查看器或 PowerShell 查看虚拟机监控程序启动事件日志。
使用 PowerShell 查询虚拟机监控程序启动事件的系统日志
若要使用 PowerShell 查询 ID 为 2 的虚拟机监控程序事件的系统日志,请运行以下命令:
Get-WinEvent -FilterHashTable @{ProviderName="Microsoft-Windows-Hyper-V-Hypervisor"; ID=2} -MaxEvents 1