为什么我们的软件在虚拟化下运行得如此之慢?

Mor*_*nar 7 c windows virtualization profiling verysleepy

我试图找出为什么我们的软件在虚拟化下运行时运行得如此之慢.我见过的大多数统计数据表明,在最坏的情况下,它应该只有10%的性能损失,但在Windows虚拟服务器上,性能损失可能是100-400%.我一直试图描述差异,但是个人资料结果对我来说并没有多大意义.这是我在没有虚拟化的Vista 32位盒子上进行配置时看到的内容: 在此输入图像描述

这是在带有虚拟化的Windows 2008 64位服务器上运行的:在此输入图像描述

缓慢的是花费了大量的时间,RtlInitializeExceptionChain在快速的时间显示为0.0s.知道那是做什么的吗?此外,当我附加到我的机器的进程时,只有一个线程,PulseEvent但是当我在服务器上连接时,有两个线程,GetDurationFormatExRtlInitializeExceptionChain.据我所知,我们编写的代码只使用一个线程.此外,对于它的价值而言,这是一个仅使用纯C编写的控制台应用程序,完全没有UI.

任何人都可以为我解释这些吗?甚至只是关于其中一些ntdllkernel32电话正在做什么的信息?我也不确定有多少差异是64/32位相关的,有多少是虚拟/非虚拟相关的.不幸的是,我无法轻松访问其他配置以确定差异.

Dig*_*oss 6

我想我们可以将虚拟机性能降低的原因分为两类:

1.配置偏差

此类别适用于与虚拟化本身无关但所配置的虚拟机不如真实虚拟机的所有内容.一个非常简单的事情是给虚拟机只有一个CPU核心,然后将它与运行在2-CPU 8核16超线程Intel Core i7怪物上的应用程序进行比较.在您的情况下,您至少没有运行相同的操作系统.最有可能还存在其他偏差.

2.虚拟化不合适

像执行大量锁定的数据库之类的东西不能很好地虚拟化,因此典型的开销可能不适用于测试用例.这不是你的确切情况,但我被告知MySQL的罚款为30-40%.我注意到列表中有一个名为...信号量的入口点.这是一个会慢慢虚拟化的迹象.

基本问题是无法在用户模式下本地执行的构造将需要陷阱(缓慢,全部由它们自己),然后在管理程序仿真代码中进一步开销.