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