8

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

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

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

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

(此线程中也描述了问题)

更新:

我们已将 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 需要 <1s 才能运行......

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

任何关于 nexus 在收到人工制品后做什么的想法都值得赞赏。

更新 2

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

...

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

osnpslfDefau~ - 复制缓冲区大小为: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 on

...

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   

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

...

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

osnpmmM2Group~ - public retrieveItem() :: FOUND 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==] -

osnpaDefaultAt~ - 在 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 持有者=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   

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

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

4

1 回答 1

2

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

如果您将 Hudson 作为服务启动与从命令行启动 Hudson 有什么区别吗?

更新

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

于 2011-03-16T17:30:43.620 回答