是的,有趣的问题。
给定:Hyper-V 虚拟机的主机。HPC 类型的集群。
上面有许多虚拟机。他们大部分时间都不会用完 CPU。我们还在内部运行一个 HPC 风格的集群——代理拉取作业并处理它们。
有一个关于在我们的 Hyper-V 机器上安装代理的谈话。目前这会给我们带来显着的性能提升——我们需要夏天才能真正提升计算集群的硬件。
代理在低优先级线程中运行所有计算。对于普通计算机,这意味着代理基本上会最大化 CPU 使用率,但不会真正干扰计算机操作本身——我什至可以在代理运行时观看 DVD。
现在,Hyper-V 的情况如何?Hyper-V 内核赋予虚拟 CPU 什么“线程优先级”?根分区是否比虚拟机具有更高的优先级?我不希望代理干扰正在运行的虚拟机。
Hyper-V 父分区或管理操作系统在管理程序中是特殊的。如果它的虚拟处理器是可运行的,那么它们的优先级将大大高于来宾虚拟机。这是因为,在受支持的 Hyper-V 配置中,管理操作系统唯一做的事情(从统计上讲)是代表来宾 VM 的 I/O。如果您在管理操作系统中安装任何其他东西,那么您将代表来宾 VM 抢占工作。
我假设您已经想到了这一点,但您可以通过受支持的方式来做到这一点。创建一个与物理机大小基本相同的 VM。给它非常低的 CPU 和内存权重并打开动态内存,以便在空闲时不会使用太多内存。在该 VM 中运行您的计算任务。然后,Hyper-V 将更愿意为任何其他来宾而不是那个来宾工作,但会代表您的计算任务使用空闲周期。
首先,我要解决这个问题:不建议在 Hyper-V 的父分区(主机操作系统)上运行任何额外的工作负载。它的唯一目的是为系统上的其他来宾 VM 提供管理和控制功能,并让管理员查看系统上的其他来宾 VM。也就是说,您当然可以做到,而且它可能对您很有用。但是 Microsoft 的官方立场是避免在您的父分区上运行任何额外的工作负载。现在那已经不在了:
Happy fun ASCII架构图:
父分区是您启动并从中创建和控制所有其他子 VM 的操作系统,它本身实际上只是与子分区处于同一级别的另一个逻辑分区。所有这些分区并行运行。唯一的区别是根分区被管理程序赋予了特殊的特权和责任。您可以通过 Hyper-V 管理控制台为子虚拟机分配 CPU 权重、储备和限制,但我不清楚这些是否或如何映射到我们所知道的管理程序中的线程优先级。
在您的根分区(或管理操作系统或主机操作系统)上,您将看到每个虚拟机都有一个 vmms.exe 和 1 个 vmwp.exe 实例。VM 管理服务 (vmms.exe) 负责为管理程序提供 WMI 接口,以便您可以从 MMC 管理 VM。当您在系统上创建新 VM 时,它还会创建一个新的 vmwp.exe 实例。VM 工作进程 (vmwp.exe) 执行典型的单片管理程序将执行的虚拟化工作,例如管理虚拟机的状态。
但不幸的是,就 VM 内部发生的一切而言,vmwp.exe 并不是全部,如果您正在考虑从管理操作系统中操纵这些进程的优先级,您可能处于未知状态,可能不支持的领土。还有超级调用和启发式调用等,它们可能不会对 vmwp.exe 进程收费,但仍可被视为虚拟机整体工作负载的一部分。
除了可能存在于根分区而不是子分区中的关键 Hyper-V 组件之外,它们可能会抢占其他子 VM 代码的执行,我假设所有分区在线程调度方面都与管理程序相同。
遗憾的是,Microsoft 并未发布很多深度技术文章来回答这些问题。如果不是 Russinovich 和他的朋友,我们甚至不会有Windows Internals。那里有一个关于 Hyper-V 的简短部分,我在撰写这篇文章时参考了它,但即使它并不比这篇文章更深入。