【问题标题】:Why does a hudson "mvn clean install" build take 3-6x longer than the same on the command line?为什么 hudson “mvn clean install” 构建比在命令行上花费的时间长 3-6 倍?
【发布时间】:2011-05-22 05:58:16
【问题描述】:

我们看到我们的 CI 服务器 (hudson) 上的构建时间相对较长,而且它们开始妨碍我们。我知道 hudson 不仅仅是调用 maven,我很乐意多给它 10-20% 的时间来完成这项工作,但一个数量级的减速似乎太多了。

有人知道为什么会这样以及如何解决这个问题吗?我将首先说不是的原因:

  • 虚拟机 hudson 正在运行:在命令行上,它所花费的时间与我的开发 PC 大致相同
  • 其他并发任务:我确保没有从构建任务中转移资源

maven 目标实际上是干净和安装的,没有像 javadoc、checkstyle 等那样花哨和资源密集型的东西。查看 hudson 构建任务控制台输出,当“从 [我们的 Nexus 人工制品存储库检索以前的构建号”时似乎有延迟]",但我不知道有一种简单的方法来衡量此步骤的性能,并且发布人工制品似乎过于简单,无法证明速度的总差异是合理的。

(问题也在this线程中描述)

更新:

我们已将 Hudson/Jenkins 升级到最新版本,并且能够使用计时插件。短版:

  • 好消息:我们现在知道 nexus 导致了问题
  • 坏消息:我们仍然不知道为什么

更多细节

在我们的一个实际 maven 项目中(maven 构建时间:3 分钟,hudson 构建时间:9 分钟),我们可以看到 hudson 也在 3 分钟内执行构建,但随后需要 6 分钟将人工制品上传到 nexus。

使用 nexus 的 Web UI 手动上传另一个人工制品,我能够确认以下内容:

  • 实际的人工制品上传只需很短的时间(即几秒钟)
  • 几秒钟后,人工制品显示为<nexusworkdir>/nexus/storage/test/test2/test2/1.0.0/test2-1.0.0.rpm

真正的谜题是为什么 nexus 需要花费一分钟时间来创建这个文件: <nexusworkdir>/nexus/proxy/attributes/test/test2/test2/1.0.0/test2-1.0.0.rpm

据我所知,它只是计算 MD5 和 SHA1 签名并记录一般人工制品信息,但是 75MB 文件的 md5sum 和 sha1sum 需要

最后,它似乎不是某种网络超时,因为延迟似乎与伪像大小大致成正比。

如果 nexus 在收到人工制品后会做什么,我们将不胜感激。

更新 2

将 nexus 日志级别设置为调试,当上传人工制品时,nexus 会记录以下内容:

...

2011-04-05 14:38:53 DEBUG [jpsc28za2RtYQ==] -

o.s.n.p.s.l.f.Defau~ - 复制缓冲区大小为: 4096

2011-04-05 14:39:55 DEBUG [ython-2.5.2.jar] - org.mortbay.log   

- 响应 /nexus/content/groups/public/org/python/jython/2.5.2/jython-2.5.2.jar 200

2011-04-05 14:40:07 DEBUG [-2.5.2.jar.sha1] - org.mortbay.log   

- 请求 /nexus/content/groups/public/org/python/jython/2.5.2/jython-2.5.2.jar.sha1 开

...

2011-04-05 14:40:12 DEBUG [-2.5.2.jar.sha1] - org.mortbay.log   

- 响应 /nexus/content/groups/public/org/python/jython/2.5.2/jython-2.5.2.jar.sha1 200

2011-04-05 14:43:45 DEBUG [ndex.properties] - org.mortbay.log   

- 请求 /nexus/content/groups/public/.index/nexus-maven-repository-index.properties 在 org.mortbay.jetty.HttpConnection@141a720

...

2011-04-05 14:44:04 DEBUG [ndex.properties] -

o.s.n.p.m.m.M2Group~ - 公共 检索项目()::找到 public:/.index/nexus-maven-repository-index.properties

2011-04-05 14:44:04 DEBUG [ndex.properties] - org.mortbay.log   

- 响应 /nexus/content/groups/public/.index/nexus-maven-repository-index.properties 200

2011-04-05 14:48:07 DEBUG [jpsc28za2RtYQ==] -

o.s.n.p.a.DefaultAt~ - 存储属性 UID=test:/test/test/1.0.1/test-1.0.1.rpm

...

2011-04-05 14:48:07 DEBUG [w/icon-info.gif] - org.mortbay.log   

- servlet holder=nexus

2011-04-05 14:48:08 DEBUG [w/icon-info.gif] - org.mortbay.log   

- 响应 /nexus/ext-2.3/resources/images/default/window/icon-info.gif 200

2011-04-05 14:49:01 DEBUG [c=1302007326656] - org.mortbay.log   

- 请求 /nexus/service/local/log/config on org.mortbay.jetty.HttpConnection@1dbd88f ....

它似乎只是在那里坐了一分钟左右,然后继续工作。任何关于为什么 nexus 这样做的想法都值得赞赏。

【问题讨论】:

  • 检查hudson是否真的使用Java 1.6而不是java 1.5来编译。这有很大的不同。
  • 感谢 Peter 的建议,但机器上没有安装 Java 1.5:我们使用的是 OpenJDK 64 位服务器 VM(内部版本 14.0-b16,混合模式)。
  • 您是否包括了从 scm 到 Hudson 构建时间检查代码的时间?如果不是,请比较手册和 Hudson 构建的输出以找出差异。它可能只是不同的java设置。 (提高两者的详细程度)
  • 我不认为代码签出会很重要:我只是尝试了一下,大约需要 5 秒才能完成,这还有很多需要解释的地方。我将尝试使用“timestamper”hudson 插件获取更多信息,但我必须升级 hudson 才能做到这一点......
  • Maven 确实在其进程中提供了时间戳,因此您应该能够看到它挂在哪里(如果它只是导致问题的唯一步骤)。另外,检查 maven Hudson 使用的是哪个版本。您可能在命令行和开发盒上使用 Maven 3,但 Hudson 配置为使用 Maven 2。Maven 3 至少是 2 的两倍,这可能可以解释这一点。

标签: performance maven-2 hudson nexus jenkins


【解决方案1】:

正如线程中所讨论的,我怀疑您的分叉 Maven 没有传递 JVM 参数。您可以使用 jconsole 检查允许的最大堆是您在 MAVEN_OPTS 中分配的吗?

将 Hudson 作为服务启动与从命令行启动 Hudson 有什么不同吗?

更新

在 Nexus 上部署需要大量的 RAM,而不仅仅是编译(根据我的经验)。低内存的交换可能会减慢它的速度。

【讨论】:

  • 感谢您的回答,但我认为这无法解释为什么 Jenkins 构建二进制文件的速度几乎与 Maven 一样快,但部署它却需要很长时间。
  • 部署需要大量内存,比编译要多得多(根据我的经验)。内存不足的交换可能会减慢它的速度。
  • 这可能需要研究,但我应该调整的不是 Maven 的 JVM 设置,而是 Nexus 的。我看看能不能抽出时间试试看……
  • 就是这样,看起来:当我们增加运行 Nexus 的 Xen VM 的可用内存量时,部署时间变得可以忽略不计。我可能会再做一些测试来确认,但除非它们显示出意外的东西,否则我认为这个问题已经解决了......
  • 所以你的基本问题是底层平台内存太少并开始交换。您是在初步调查中对此进行检查,还是仅仅关注 JVM 性能?
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2018-10-08
  • 1970-01-01
相关资源
最近更新 更多