在 Travis CI (http://travis-ci.org)我们使用 VirtualBox VM(通过 Vagrant)为 Ruby 社区运行测试。
在我们的工作服务器上,我们最多有 N 个并行进程,在 N 个 VM 中并行运行 N 个测试套件,即一个工作进程一次在一个 VM 中运行一个测试套件,但其中 N 个是同时运行的。
现在,一旦许多工作者实际上并行执行构建,与在单个工作者中运行完全相同的构建(并且没有其他并行运行)相比,每个构建的性能将显着下降。
以下是一个例子:
此“构建矩阵”由 20 个单独的构建组成:
http://staging.travis-ci.org/#!/svenfuchs/rails/builds/1906
运行此程序时,有 10 个工作程序正在运行,因此此构建开始时在 10 个工作程序(和虚拟机)中并行执行 10 个单独的构建。此构建是其中之一,花费了大约 2 小时才完成:
[请参阅上面页面列表中的最后一个链接,我只能发布 2 个网址]
当没有其他构建同时执行时,同样的构建仅需要约 20 分钟。以下是一个例子:
http://staging.travis-ci.org/#!/svenfuchs/rails/builds/1927
显然,我们需要解决这个性能下降问题,但我们不知道从哪里着手。
测试套件基本上执行 Ruby 进程,这些进程可能会产生并生成其他几个 Ruby 进程,每个进程都会在代码库上执行单元测试。其中一些进程会访问 MySQL、Sqlite3 和 Postgres 等数据库,但我们也注意到,完全不访问任何数据库的测试也会出现同样的性能下降。
托管这些进程和虚拟机的工作服务器如下所示:
- Linux 2.6.32-31-server #61-Ubuntu SMP 星期五 4 月 8 日 19:44:42 UTC 2011 x86_64 GNU/Linux
- 12x (六核) Intel(R) Core(TM) i7 CPU 950 @ 3.07GHz
- 12 GB 内存
每个虚拟机:
- Linux lucid32 2.6.32-28-generic #55-Ubuntu SMP 2011 年 1 月 10 日星期一 21:21:01 UTC i686 GNU/Linux
- 1x Intel(R) Core(TM) i7 CPU 950 @ 3.07GHz
- 1 GB 内存
如果能提供任何关于如何解决这个问题或者更好地找出根本问题的提示,我们将不胜感激。
谢谢!
答案1
您没有提到这些服务器上的底层磁盘是什么样的,但这些类型的性能问题几乎总是与 IO 相关。当您运行多个构建而不是只运行一个构建时,IO 统计数据是什么样的?
此外,与 VirtualBox 相比,使用 Xen 或 VMware ESXi 之类的软件可以获得更好的硬件性能。
答案2
您是否曾尝试修改以下内容vm.attributes
?
attribute :cpus
attribute :synthcpu
我在 VirtualBox 虚拟机上进行大量并行化时遇到过一次问题,它实际上使用的线程数超过了主机和配置的虚拟机所能提供的线程数。减少虚拟 CPU 的数量对我很有帮助。
这也许是一个提示,提示你应该看哪里......
对这些属性的引用可以在这里找到:
配置.vm.自定义:http://vagrantup.com/docs/vagrantfile.html 虚拟机属性:http://mitchellh.github.com/virtualbox/VirtualBox/VM.html
祝你好运.. :)
答案3
我对服务器有点困惑。服务器是 12 个 CPU x i7-950 四核 CPU?什么机箱可以做到这一点?如果有的话,我想要一个!您还提到了六核,但 950 部分是四核。您有多少个真正的核心可用?由于我从未听说过 i7 的 12x 主板,我假设您的意思是您有 2 个 i7-970(六核),总共 12 个核心和 12GB 内存。
在我看来,您的问题非常清楚。您正在运行操作系统 + 10 个虚拟机,每个虚拟机分配有 4 个核心。对于具有 12 个物理核心(超线程为 24 个)的机器上的操作系统,这至少是 40 个虚拟核心加上另外 1 个。我预计 2 个虚拟机在此配置下可以正常工作,然后会看到严重的性能下降。
如果您确实有您所描述的(12 x i7-950),即 48 个真实核心,在这种情况下,问题就是 RAM AD I/O。
我没有任何特定的 VirtualBox 经验,但我确实了解 VMWare 和硬件。
祝你好运
答案4
我也怀疑是磁盘 io。但是您没有提到您已经为此执行了哪些检查。top?vmstat?iostat?
绘制每个虚拟机数量的 CPU 负载并查看性能是否突然下降可能很有趣。也许当虚拟机数量为 2 或 3 时,性能会线性增加,但一旦达到 10,性能就会下降。这很可能也是由内存 io 引起的,它与磁盘 io 有同样的问题,尽管速度更快:软件可能不再适合缓存,因此它必须从内存中获取内容,而内存由其他 12 个 CPU 共享。
只是我的看法。