我有一个应用程序在专用和虚拟服务器环境中运行(所有都是 Windows Server 2008 R2)。鉴于服务器的规格(内存、处理器)几乎相同,在执行复杂任务的时间方面,在虚拟服务器上运行的应用程序远远不如在专用服务器上运行的应用程序,执行时间是后者的 2 倍。在此任务期间,虚拟服务器的处理器利用率持续保持在 30% 左右,尽管很少超过该水平。专用服务器的处理器利用率从未超过 5%。两台服务器上都有足够的可用内存,我没有看到任何磁盘读/写瓶颈。
我希望能够建议虚拟服务器需要更多资源来提高性能,但我不确定这些资源应该是什么,因为根据性能指标,似乎没有任何东西负担过重。
对于为什么我的应用程序在虚拟服务器上运行得如此之慢,我是否遗漏了什么?
答案1
一个区别可能是,在大多数虚拟机管理程序中,并非所有性能增强 CPU 功能都可供客户机使用。(这是其他原因之一,因为例如,当客户机在旧主机上使用目标主机上不存在的 CPU 扩展时,实时迁移将不会成功。)
默认情况下,大多数虚拟机管理程序仅会公开有限但几乎普遍兼容的 CPU 功能子集。如果您的应用程序受益于此类功能,则在测试时它们可能仅在您的裸机服务器上可用。
这是一个很好的例子,说明 CPU 功能可能在两者中都缺失KVM(Qemu)和Hyper-V具有默认设置的访客是AES 和 AES-NI指令集通常会显著加快 AES 加密/解密速度。
答案2
不幸的是,这是意料之中的。虚拟化对性能有重大影响CPU 密集型应用程序,特别是当进程并发程度较高时。我一直在测试虚拟化的性能影响多年来,尽管情况在过去十年有所改善,但改善幅度并不大。即使是当前不受 Spectre 和 Metdown 缓解措施影响的 AMD CPU 也表现出虚拟化时性能损失 17-25%在纯粹受 CPU 限制的工作负载上。
在高并发性的高负载下,高开销表现得尤其糟糕,因为在虚拟机管理程序下,上下文切换的成本要高得多。低并发性的轻负载性能损失相对较小,但使客户机 CPU 饱和的高并发负载性能会明显下降。
可以通过以下方式减轻部分性能开销:
- 将 vCPU 固定到物理 CPU
- 从大内存页面(2MB 对 4KB)分配客户内存。
在最新的 AMD CPU 上,即使在繁重的并发工作负载下,这通常也会将开销限制在不超过 20%。
答案3
仅仅关注系统范围内的 CPU/内存/磁盘利用率并不能解决许多性能问题。
分析应用程序以查看到底是什么导致速度缓慢。在 Windows 上,尝试Windows 性能工具包(fka Xperf)。数据可以通过多种方式进行比较和可视化,包括火焰图。
虚拟化使事情变得复杂,因为可以做一些愚蠢的事情,例如超额订阅或限制主机的资源,而客户机却不会注意到。比较“专用服务器”与虚拟化,主机上只有一个虚拟机使用所有主机的资源。这是一个更公平的比较,可以找出虚拟化与裸机的开销。