gpt4 book ai didi

performance - 为什么 hudson "mvn clean install"构建的时间比命令行上的构建时间长 3-6 倍?

转载 作者:行者123 更新时间:2023-12-03 04:51:29 26 4
gpt4 key购买 nike

我们发现 CI 服务器 (hudson) 的构建时间相对较长,并且它们开始妨碍我们。我知道 hudson 所做的不仅仅是调用 maven,我很乐意为它多分配 10-20% 的时间来完成这项工作,但数量级的放缓似乎太多了。

有人知道为什么会出现这种情况以及如何解决这个问题吗?我首先会说一下什么不是原因:

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

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

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

更新:

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

  • 好消息:我们现在知道问题是由关系造成的
  • 坏消息:我们仍然不知道原因

更多详情

在我们的一个实际 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 需要 <1 秒才能运行...

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

如果知道 Nexus 在收到文物后会做什么,我们将不胜感激。

更新 2:

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

...

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

o.s.n.p.s.l.f.Defau~ - Copying stream with buffer size of: 4096

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

- 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   

- REQUEST /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

- 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   

- REQUEST /nexus/content/groups/public/.index/nexus-maven-repository-index.properties on org.mortbay.jetty.HttpConnection@141a720

...

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

o.s.n.p.m.m.M2Group~ - public retrieveItem() :: FOUND public:/.index/nexus-maven-repository-index.properties

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

- RESPONSE /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~ - Storing attributes on 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   

- 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   

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

它似乎只是在那里坐了一分钟左右,然后就继续工作了。任何知道为什么 Nexus 这样做的想法都会受到赞赏。

最佳答案

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

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

更新:

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

关于performance - 为什么 hudson "mvn clean install"构建的时间比命令行上的构建时间长 3-6 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4388135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com