在 Travis CI ( http://travis-ci.org ),我们使用 VirtualBox VM(通过 Vagrant)来运行 Ruby 社区的测试。
在我们的工作服务器上,我们有多达(最多)N 个并行进程在 N 个 VM 中并行运行 N 个测试套件,即一个工作进程一次在一个 VM 中运行一个测试套件,但其中 N 个同时运行。
现在,一旦许多 worker 实际并行执行构建,与在单个 worker 中运行完全相同的构建(并且没有其他并行运行)相比,每个构建的性能将显着降低。
下面是一个例子:
这个“构建矩阵”由 20 个单独的构建组成:
http://staging.travis-ci.org/#!/svenfuchs/rails/builds/1906
在运行时,有 10 个工作人员在运行,因此此构建开始时在 10 个工作人员(和 VM)中并行执行 10 个单独的构建。这个构建就是其中之一,完成了大约 2 个小时:
[请参阅上页列表中的最后一个链接,我只能发布2个网址]
当没有其他构建并行执行时,完全相同的构建只需要大约 20 分钟。这是一个例子:
http://staging.travis-ci.org/#!/svenfuchs/rails/builds/1927
显然,这种性能下降是我们需要解决的问题,但我们不确定从哪里看。
测试套件基本上执行 Ruby 进程,这些进程可能会退出并产生其他几个 Ruby 进程,每个进程都在代码库上执行单元测试。其中一些攻击了 MySQL、Sqlite3 和 Postgres 等数据库,但我们也注意到完全不命中任何数据库的测试也出现了同样的降级。
托管这些进程和 VM 的工作服务器如下所示: