为什么哈德森"mvn clean install"构建比命令行上的3-6倍长?

Tom*_*vic 8 performance maven-2 hudson nexus jenkins

我们在CI服务器(哈德森)上看到相对较长的构建时间,并且它们开始妨碍我们.我知道哈德森所做的不仅仅是调用maven而且我很乐意为它提供10-20%的工作时间,但是数量级减速似乎太多了.

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

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

maven目标实际上是干净和安装,没有任何花哨和资源密集,如javadoc,checkstyle等.查看hudson构建任务控制台输出,当"从[我们的Nexus artefact存储库]中检索以前的构建号"时,似乎有延迟,但我不知道一个简单的方法来衡量这一步的表现,发布一个人工制品似乎太简单了,无法证明速度的总差异.

(问题也在这个帖子中描述)

更新:

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

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

更多细节

在我们的一个真正的maven项目(maven构建时间:3分钟,哈德森构建时间:9分钟)我们可以看到哈德森也在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日志级别设置为debug,nexus会在上传人工制品时记录以下内容:

...

2011-04-05 14:38:53 DEBUG [jpsc28za2RtYQ==] -
Run Code Online (Sandbox Code Playgroud)

osnpslfDefau~ - 复制缓冲区大小为4096的流

2011-04-05 14:39:55 DEBUG [ython-2.5.2.jar] - org.mortbay.log   
Run Code Online (Sandbox Code Playgroud)

- RESPONSE /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   
Run Code Online (Sandbox Code Playgroud)

- 请求/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   
Run Code Online (Sandbox Code Playgroud)

- RESPONSE /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   
Run Code Online (Sandbox Code Playgroud)

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

...

2011-04-05 14:44:04 DEBUG [ndex.properties] -
Run Code Online (Sandbox Code Playgroud)

osnpmmM2Group~ - public retrieveItem():: FOUND public:/.index/nexus-maven-repository-index.properties

2011-04-05 14:44:04 DEBUG [ndex.properties] - org.mortbay.log   
Run Code Online (Sandbox Code Playgroud)

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

2011-04-05 14:48:07 DEBUG [jpsc28za2RtYQ==] -
Run Code Online (Sandbox Code Playgroud)

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   
Run Code Online (Sandbox Code Playgroud)

- servlet holder = nexus

2011-04-05 14:48:08 DEBUG [w/icon-info.gif] - org.mortbay.log   
Run Code Online (Sandbox Code Playgroud)

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

2011-04-05 14:49:01 DEBUG [c=1302007326656] - org.mortbay.log   
Run Code Online (Sandbox Code Playgroud)

- org.mortbay.jetty.HttpConnection@1dbd88f上的REQUEST/nexus/service/local/log/config ....

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

art*_*tol 2

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

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

更新

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