我有一台运行 vSphere 6.5 的虚拟机,它有 24 个 vCPU。该服务器有两个物理 CPU(xeon e5-2699 v4),有 22 个核心,并且启用了超线程。
vcpu 在物理 cpu 上究竟是如何运行的?将 vcpu 减少到 22 个以便可以在一个物理 cpu 上运行会更好吗?或者在这种情况下 vSphere 甚至会使用多个物理 cpu?
答案1
单个虚拟机的虚拟 CPU 数量绝不能多于可用的逻辑物理核心数量。
启用超线程后,您将拥有 44 个逻辑物理核心,因此这应该没问题。但是,这在很大程度上取决于该主机上运行的虚拟机数量。您必须记住的一件事是 ESXi 服务器的 CPU 调度程序如何工作。对于每个 CPU 周期,它总是等待,直到虚拟机上的每个虚拟 CPU 都有一个可用的物理核心。因此,在您的例子中,它将始终等待,直到 22 个物理核心可用,然后才能处理 CPU 周期。如果该主机上有更多虚拟机,则可能导致 CPU 就绪时间过长和虚拟机运行非常缓慢。
就我个人而言,我始终尝试将 vCPU 数量保持在 8 个或更少。如果可以,最好将虚拟机向外扩展,而不是向外扩展。
另一个考虑因素:鉴于目前针对 Spectre 和 Meltdown 攻击的缓解措施,通常建议禁用超线程,因为这会减少可能的攻击媒介。如果您决定禁用超线程,您的配置很可能将不再可用。
答案2
1) 超线程核心不是真正的核心,不应算作真正的核心。估计值各不相同,但我见过的数据表明,启用超线程可为您在 vSphere 中带来低至 10-30% 的额外性能。
2) 为虚拟机分配更多 vCPU 时应始终谨慎考虑,尤其是在数量较大的情况下。原因(大大简化)是资源调度程序必须找到一个时间段,其中有足够的核心可用来同时执行所有核心。因此,在一个简化的、极不现实的示例主机上,假设有 10 个核心和 10 个虚拟机,每个虚拟机有 2 个 vCPU,则有 5 个虚拟机在等待(即停止)一半时间,而 5 个虚拟机在执行,在每个状态之间交替。这没问题,因为所有虚拟机都在获得 CPU 时间,一切都很顺利。现在我们介绍第 11 个虚拟机,它有 10 个 vCPU。突然间,你有 10 个虚拟机在等待,而大虚拟机完成它的工作,然后其中 5 个执行,然后是其他 5 个。所以现在你的虚拟机运行的时间是 33%,而不是 50%。在复杂的环境中,分配相对大量的 vCPU 可能会降低性能,尤其是在 VM 没有运行任何可以实际使用所有 vCPU 的程序时。
3) 我个人的最佳做法是,永远不要让虚拟机在单个处理器上拥有超过一半的逻辑核心,对于 Xeon 处理器来说,这通常也是一个相当合理的数字。这可以避免“依赖”过多的 HT“核心”的问题,还可以让您的虚拟机适合单个处理器,从而让调度程序更容易。
还有 NUMA 节点的概念需要考虑,如果您开始为 VM 提供比主机中单个处理器所能提供的更多的 vCPU,那么您基本上就是在强制 vSphere 将 VM 拆分到 2 个 NUMA 节点之间,从而使得内存访问速度变慢,因为并非所有内存都是任一处理器的本地内存。
vSphere 调度虚拟机资源的背后还有更多的神奇之处,我上面所写的内容已经大大简化了,但这些指导原则在我近十年中一直发挥着良好的作用。
答案3
我无法想象你会希望单个虚拟机分配的 vCPU 数量比服务器上的物理核心数量还多。
使用当前 VM 配置对工作负载进行基准测试,然后查看逐渐降低 vCPU 数量时会发生什么情况。从虚拟机管理程序的角度(而不是客户操作系统的角度)记录工作负载的执行速度以及主机/VM 上的实际 CPU 使用率。
通常,在设置虚拟机时,最好从较少数量的 vCPU 开始,然后逐步增加,直到性能提升趋于平稳。对于许多工作负载,您不一定需要坚持使用偶数个 vCPU,尽管这一原则也有例外。同样,良好的测试运行应该显示您的应用程序如何处理其环境。
答案4
根据 VMware 最大值 (https://configmax.vmware.com/) 每个物理核心可以有 32 个 vCPU,但根据最佳实践,您不应分配比实际拥有的核心数量更多的核心。
但请记住,您可以根据您的工作量和需求进行限制、保留和优先排序。
您可以阅读关于同一主题的另一个答案这里。