我正在分析一个问题,即虚拟机中受 CPU 限制的工作负载的性能通常(并非总是)远低于我们基于底层硬件的预期。
我们在 Windows Server 2012 R2 上使用 Hyper-V。该服务器具有双 Intel Xeon E5-2643 v2 @ 3.50 GHz。
以下是一些似乎相关的数字:
- Hyper-V 管理程序逻辑处理器,% 总运行时间,实例 _Total:平均 20%
- Hyper-V Hypervisor Virtual Processor, CPU Wait Time Per Dispatch, Instance _Total: Average 20000到另一个 VM 的逻辑 CPU;似乎转换为 2% 的开销)
- Hyper-V 管理程序逻辑处理器,最大频率百分比,实例 _Total:平均 34%
- CPU-Z 工具显示两个处理器的核心 #0 的大部分时间都在 1200 MHz 左右(与性能监视器报告的最大频率百分比非常匹配)
在只有几个内核的桌面上,一旦 CPU 密集型活动开始,内核速度就会立即提高。
然而,在我们的 Hyper-V 主机上,核心速度似乎只有在整体系统负载似乎高了几秒钟的情况下才会上升。现在,例如,如果您的 VM 具有总共 24 个物理 CPU 中的 4 个虚拟 CPU(启用了超线程),并且该 VM 需要 CPU 电源,并且 VM 内的任务管理器显示几乎 100% 的 CPU 使用率,大部分时间是时钟物理CPU的速度不会上升,性能很差。
显然这是不受欢迎的行为。考虑一个数据库服务器,它需要 3 倍的时间来回答查询,因为服务器没有“足够”的负载来提高 CPU 频率。这没有任何意义。
我发现一篇博客文章描述了 2011 年以来 VMWare 和 Cisco 刀片的完全相同的行为。我在其他任何地方都没有找到这方面的信息。
实际上,我可以通过切换到 Windows 中的“高性能”电源计划来摆脱这种行为powercfg.cpl
,但代价是用电量增加了大约 30%。我实际上获得了更好和更一致的性能,并且性能监视器显示了更低的负载数字。
(在较旧的服务器上,我发现了一个附加设置“处理电源管理 | 最低处理器状态”,可以设置为 100% 而无需禁用所有其他省电选项。新的仅显示“系统冷却策略”,它处于“活动”状态“即使是“平衡”计划,所以我唯一的选择是选择“高性能”。)
这真的是 Hyper-V 主机的最佳实践,还是有其他解决方法?如果 SpeedStep 真的是个问题,我想知道为什么他们甚至将其构建到服务器 CPU 中并默认启用它,以及为什么我从未在 Hyper-V 配置指南中阅读过有关此设置的信息?
经过一番搜索,这似乎是现代服务器 CPU 的普遍问题,甚至与虚拟化无关,主要服务器供应商以及微软和 VMWare 等软件供应商在他们的产品中使用人为限制 CPU 性能的默认设置。我仍然觉得这很难相信。
对于任何关心立即获得每个内核的完整 CPU 功率而不一开始所有内核都处于忙碌状态的人的解决方案是禁用节能(Intel SpeedStep/EIST 或 AMD Cool'n'Quiet)。根据您的 BIOS 设置,这可以在操作系统级别(如 Windows
powercfg.cpl
“高性能”计划)或通过 BIOS 进行控制,在这种情况下,操作系统设置为灰色。Brent Ozar 在 2011 年写了这篇文章(“SQL Server on Power-Saving CPUs? Not So Fast.”):
微软在KB2207548中说:
Win2008R2 有一个可用的修补程序,建议更新 BIOS,但由于这仍然是 Win2012R2 的问题,因此似乎无法绕过第二个建议,“高性能”计划。
KB2534356中描述了具有类似症状的问题,该问题还提供了仅适用于 Win2008R2 的修补程序。所以对我来说,只有通常的解决方法适用(高性能计划),但听起来将来可能会有修复。(它在台式机 CPU 上运行良好,所以我不明白为什么它不应该在服务器上实现。)
我会更新这个答案,以防我找到更好的解决方案(或者如果其他人发布解决方案,当然会更改接受的答案)。
仍然想知道 EC2 或 Azure 是否可能有同样的问题(在这种情况下,您将无法对此做任何事情,因为您需要控制主机,更改 VM 中的设置不会产生任何影响)。
更多参考资料:
我只是偶尔看到这个。理论上speedstep(这似乎越来越成为一个不可配置的选项),不应该影响你的表现。然而,当它被降级时,你突然忙于一个虚拟机,有时处理器似乎认为它不够用。我不确定这是 Microsoft 的问题,因为正如您提到的 VMware 和 Cisco 有同样的问题。
它是服务器上的一个 BIOS 功能,用于删除 speedstep。在 IBM 刀片上,它有一个默认的 bios 选项:没有 speedstep,有时也没有 turbo。检查该博客的技术细节:
https://workinghardinit.wordpress.com/tag/c-states/
“根据您的发现和需求,您可能只想在 BIOS 或 Windows 中关闭 SpeedStep 或 Cool'n'Quiet”因此,如果您遇到问题,请将其关闭。
并且在 BIOS 中检查虚拟指令是否在错误的 BIOS 中未关闭。
不要忘记在旧操作系统上添加“hyperv 工具”以获得更好的“虚拟感知操作系统”。