我正在试图弄清楚为什么我们的软件在虚拟化下运行时会运行得那么慢。我见过的大多数统计数据表明,在最坏的情况下,它应该只有10%的性能损失,但在Windows虚拟服务器上,性能损失可能是100-400%。我一直试图描述差异,但是个人资料结果对我来说并没有多大意义。这是我在没有虚拟化的Vista 32位盒子上进行配置时看到的内容:
这是在具有虚拟化的Windows 2008 64位服务器上运行的一个:
速度慢的人在RtlInitializeExceptionChain
花费了大量的时间,在快速的时候显示为0.0秒。知道那是做什么的吗?此外,当我附加到我的机器的进程时,只有一个线程PulseEvent
但是当我在服务器上连接时,有两个线程GetDurationFormatEx
和RtlInitializeExceptionChain
。据我所知,我们编写的代码只使用一个线程。此外,对于它的价值而言,这是一个仅使用纯C编写的控制台应用程序,完全没有UI。
任何人都可以为我解释这些吗?甚至只是关于其中一些ntdll
和kernel32
调用正在做什么的信息?我也不确定有多少差异是64/32位相关的,有多少是虚拟/非虚拟相关的。不幸的是,我无法轻松访问其他配置以确定差异。
答案 0 :(得分:6)
我想我们可以将虚拟机性能降低的原因分为两类:
此类别适用于与虚拟本身无关的所有内容,但配置的虚拟机不如真实的虚拟机。一个非常简单的事情是给虚拟机只有一个CPU核心,然后将它与运行在2-CPU 8核16超线程Intel Core i7怪物上的应用程序进行比较。在您的情况下,您至少没有运行相同的操作系统。最有可能还存在其他偏差。
执行大量锁定的数据库之类的东西不能很好地虚拟化,因此典型的开销可能不适用于测试用例。这不是你的确切情况,但我被告知MySQL的罚款为30-40%。我注意到列表中有一个名为 ...信号量的入口点。这是一种可以缓慢虚拟化的标志。
基本问题是无法在用户模式下本地执行的构造将需要陷阱(缓慢,全部自己),然后在管理程序仿真代码中进一步开销。
答案 1 :(得分:0)
我假设您为虚拟机提供了足够的资源,虚拟化的好处是将5台仅运行10-15%CPU /内存的计算机整合到一台运行在50-75%的计算机上CPU /内存,对于那些“突发”时间仍然会留下25-50%的开销。
个人轶事:20台机器被虚拟化,但每台机器都使用尽可能多的CPU。当单个机器试图使用比单个核心所能提供的更多功率时,这会引起问题。因此,虚拟机管理程序在多个核心上虚拟化单个核心,从而降低了性能。 一旦我们将每个VM的CPU使用率限制在任何单个核心的最大可用性,性能就会暴涨。