VirtualBox在并行运行多个虚拟机时性能下降

在Travis CI( http://travis-ci.org )上,我们使用VirtualBox虚拟机(通过Vagrant)来运行Ruby社区的testing。

在我们的工作服务器上,我们有多达N个并行进程在N个虚拟机中并行运行N个testing套件,即一个工作进程一次在一个虚拟机上运行一个testing套件,但其中N个正在同时运行。

现在,只要许多工作人员实际上并行地执行构build,与在同一个工作人员中运行完全相同的构build(而没有其他任何其他方面并行)相比,每个构build的性能将显着降低。

这里是一个例子:

这个“构buildmatrix”由20个独立的构build组成:

http://staging.travis-ci.org/#!/svenfuchs/rails/builds/1906

在运行的时候,有10名工人正在运行,所以这个工作是在10个工人(和VM)并行执行的10个独立工作的基础上开始的。 这个版本就是其中之一,花费了2个小时才完成:

[见上面的页面列表中的最后一个链接,我只能发布2个url]

当没有其他构build并行执行时,同样的构build只需要大约20分钟。 这是一个例子:

http://staging.travis-ci.org/#!/svenfuchs/rails/builds/1927

显然这种性能下降是我们需要解决的问题,但我们不确定在哪里寻找。

testing套件基本上执行Ruby进程,这些进程可能会掏出并产生几个其他的Ruby进程,每个进程在代码库上执行unit testing。 其中一些命中数据库,如MySQL,Sqlite3和Postgres,但我们也注意到同样的退化testing,根本没有打到任何数据库。

托pipe这些进程和虚拟机的工作服务器如下所示:

  • Linux 2.6.32-31-server#61-Ubuntu SMP周五4月8日19:44:42 UTC 2011 x86_64 GNU / Linux
  • 12x(Hexacore)Intel(R)Core TM i7 CPU 950 @ 3.07GHz
  • 12 GB内存

每个VM:

  • Linux lucid32 2.6.32-28-generic#55-Ubuntu SMP Mon Jan 10 21:21:01 UTC 2011 i686 GNU / Linux
  • 1个Intel(R)Core(TM)i7 CPU 950 @ 3.07GHz
  • 1 GB内存

任何提示如何排除这个问题,或者只是更好地确定根本问题将不胜感激。

谢谢!

您没有提到这些服务器上的底层磁盘,但是这些types的性能问题几乎总是与IO相关的。 当你运行多个版本而不仅仅是一个版本时,IO统计数据是什么样的?

另外,通过使用Xen或VMware ESXi而不是VirtualBox,您的硬件性能会更好。

你有没有尝试修改以下vm.attributes

attribute :cpus

attribute :synthcpu

在VirtualBox虚拟机上执行大量并行操作时,我遇到了一个问题,它实际上使用了比主机和configuration虚拟机更多的线程。 减less虚拟CPU的数量帮助了我那个时间。

这可能是一个暗示在哪里看..

这些属性的引用可以在这里find:

config.vm.customize: http : //vagrantup.com/docs/vagrantfile.html VM属性: http : //mitchellh.github.com/virtualbox/VirtualBox/VM.html

祝你好运.. :)

我有点困惑在服务器上。 该服务器是一个12 cpu x i7-950四核心cpus? 什么盒子可以做到这一点? 如果存在,我想要一个! 你也提到hexacore,但950部分是四核。 你有多less真实的核心可用? 正如我从来没有听说过i7的12x板一样,我假设你的意思是你有2个i7-970(这是hecacore)共12个内核和12gb内存。

你的问题看起来很清楚。 您正在运行OS + 10个虚拟机,每个虚拟机分配4个内核。 对于具有12个物理内核的盒(具有超线程的24个)的操作系统,这是至less40个虚拟内核加上另一个1。 我希望2台虚拟机在这个configuration上运行良好,然后看到超过这个严重的降级。

如果你真的有你所描述的(12 x i7-950),这是48真正的核心,在这种情况下,问题是内存和广告I / O。

我没有任何特定的virtualbox经验,但我知道vmWare和硬件。

祝你好运

我也会怀疑磁盘io。 但是你没有提到你已经为此执行了什么检查。 最佳? vmstat的? iostat的?

绘制每个虚拟机数量的CPU负载并查看性能是否突然下降可能会很有趣。 也许有两三个你会得到一个线性的性能提升,但是一旦你达到了十个就会下降。 这很可能是由内存io引起的,它与磁盘io有相同的问题,尽pipe速度更快:软件可能不再适合caching,所以它必须从内存中获取它的东西,这是由另外12个cpus共享。

只是我2美分。