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

7
我正在试图弄清楚为什么我们的软件在虚拟化环境下运行得如此之慢。大多数统计数据显示,最坏情况下只会有10%的性能损失,但在Windows虚拟服务器上,性能惩罚可能达到100-400%。我一直在尝试分析差异,但是分析结果对我来说没有太多意义。以下是我在没有虚拟化的Vista 32位电脑上进行分析时看到的情况: enter image description here 以下是在带有虚拟化的Windows 2008 64位服务器上运行的情况: enter image description here 较慢的那个花费了大量时间在RtlInitializeExceptionChain中,而快速的那个则显示为0.0秒。你知道这是做什么的吗?此外,当我连接到进程时,我的机器上只有一个线程PulseEvent,但是当我在服务器上连接时,有两个线程GetDurationFormatExRtlInitializeExceptionChain。据我所知,我们编写的代码仅使用单个线程。另外,值得一提的是,这是一个纯C编写的控制台应用程序,没有任何UI界面。
有人能为我解释这其中的任何问题吗?甚至只是提供一些关于这些ntdllkernel32调用在做什么方面的信息?我也不确定差异中有多少与64/32位相关,有多少与虚拟/非虚拟相关。不幸的是,我没有轻松访问其他配置来确定差异。

6
在虚拟环境中运行与非虚拟化环境相同的操作系统似乎是一个不错的起点。这样,您至少会将苹果和梨进行比较,而不是与马进行比较。 - nmichaels
1
听起来对我来说是 http://serverfault.com/。 - Teson
这正是我最担心的前两条评论。@nmichaels - 我正在努力进行苹果对苹果的比较,但进展缓慢,希望在完成之前能获得一些信息。@Sean - 简而言之,此应用程序仅打印出CTree数据库表中的每个记录。 - Morinar
3
这似乎并不是关于服务器故障的问题,很明显是关于他们在软件方面所做的使它变慢的事情,并且如何修改以避免这种情况。换句话说,它是关于编写软件在几个特定环境中良好运行的问题。 - Jerry Coffin
@Sean - 它的大小只有几MB。我正在对一个有14k条记录的表进行基准测试。 - Morinar
显示剩余3条评论
2个回答

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

1. 配置不匹配

这一类别是指所有与虚拟化本身无关的问题,但所配置的虚拟机并不如实体机好。一个非常容易犯的错误是给虚拟机只分配一个CPU核心,然后将其与在2-CPU 8-core 16-hyperthread Intel Core i7怪物上运行的应用程序进行比较。在您的情况下,至少您没有运行相同的操作系统。最有可能存在其他的问题。

2. 虚拟化适配不良

像做大量锁定的数据库等事物不能很好地虚拟化,因此典型的开销可能不适用于测试用例。这不是您的确切情况,但我被告知MySQL的惩罚是30-40%。我注意到您的列表中有一个名为...semaphore 的入口点。这表明某些东西会虚拟化得很慢。

基本问题是,在用户模式下无法执行的构造将需要陷阱(本身就很慢),然后在超级监视器仿真代码中进一步增加开销。


这些是一些很好的技巧。特别是第二个似乎非常可能发生。很想听听其他人的想法。 - Morinar

0

我假设你已经为你的虚拟机提供了足够的资源,虚拟化的好处是可以将5台只运行于10-15%的CPU/内存的机器合并到一台单独的机器上,该机器将以50-75%的CPU/内存运行,并仍然留有25-50%的余量供“突发”时使用。

个人轶事:有20台机器被虚拟化,但每台机器都在尽可能地使用CPU。当单台机器试图使用超过单核心能提供的电力时,就会出现问题。因此,虚拟机监视器会将单个核心的虚拟化分配给多个核心,导致性能下降。一旦我们将每个虚拟机的CPU使用率限制为任何单个核心可用的最大值,性能就飞速提升了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接