7

我试图弄清楚为什么我们的软件在虚拟化下运行时运行得这么慢。我见过的大多数统计数据都说,在最坏的情况下它应该只有 10% 的性能损失,但在 Windows 虚拟服务器上,性能损失可以是 100-400%。我一直在尝试分析差异,但分析结果对我来说没有多大意义。这是我在没有虚拟化的 Vista 32 位机器上配置文件时看到的内容: 在此处输入图像描述

下面是在具有虚拟化的 Windows 2008 64 位服务器上运行的一个:在此处输入图像描述

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

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

4

2 回答 2

6

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

1. 配置偏差

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

2. 虚拟化不合适

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

基本问题是,不能在用户模式下本地执行的结构将需要陷阱(缓慢,完全由它们自己),然后在虚拟机管理程序仿真代码中产生更多开销。

于 2011-04-15T20:42:57.170 回答
0

我假设您为虚拟机提供了足够的资源,虚拟化的好处是将仅以 10-15% CPU/内存运行的 5 台机器整合到将以 50-75% CPU/内存运行的单台机器上对于那些“突发”时间,这仍然会给您留下 25-50% 的开销。

个人轶事: 20 台机器被虚拟化,但每台都使用尽可能多的 CPU。当单台机器试图使用比单核所能提供的更多的功率时,这会导致问题。因此,管理程序在多个内核上虚拟化单个内核,从而降低了性能。一旦我们将每个 VM 的 CPU 使用率限制到任何单个内核可用的最大值,性能就会飙升。

于 2011-04-18T03:47:56.613 回答