在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这些进程和虚拟机的工作服务器如下所示:
每个VM:
任何提示如何排除这个问题,或者只是更好地确定根本问题将不胜感激。
谢谢!
您没有提到这些服务器上的底层磁盘,但是这些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美分。