【问题标题】:How to troubleshoot Jenkins UI slowness?如何解决 Jenkins UI 缓慢的问题?
【发布时间】:2017-11-13 20:10:00
【问题描述】:

我正在尝试解决一个问题,我希望你能帮助我解决这个问题 :) 希望这也能让其他人受益。

我有一个 Jenkins 服务器正在运行 (v2.46.2)。 由于某些原因,在浏览 Web UI 时,某些请求非常非常慢(最多 10 分钟)。第一次加载 UI 时似乎尤其如此。然后,它通常非常敏感。 如果您等待 10/15 分钟,第一个请求将再次变得非常慢。然后相当快了一段时间。

您将如何解决此问题? 到目前为止,这就是我所做的:

  1. 检查了主机的一般统计信息(cpu、ram 等)。一切正常。
  2. 检查了 Java VM 的统计信息。在我看来,内存使用情况还不错。
  3. 设置更好的监控来跟踪传入请求的 nb、处理它们的时间和状态代码。这确实表明某些请求会延迟(最多 10 分钟)。

我从互联网上阅读了许多有趣的东西,包括:Jenkins GUI only shown after waiting for 2 minutes。在这种情况下,信息有点旧(过时了?),并且由于我的工作只保留有限数量的构建,它并没有太大帮助。

这篇博文也非常有趣:https://jenkins.io/blog/2016/11/21/gc-tuning/。就我而言,我不相信问题来自垃圾收集。

我有许多假设,例如:

  1. 我使用了很多分类视图(带有正则表达式),可能效率低下?但这似乎不足以解释几分钟的延误。
  2. 只有第一页很长才能加载的事实让我觉得涉及到一些缓存。但它是 html 的缓存吗?凭据?等等。

目前,这些只是猜测。 理想情况下,我想以某种方式分析服务器响应请求所花费的时间。并从那里尝试找到这次去哪里。

这可能吗?我尝试使用 VisualVM,但这仅显示全局数据,对吗?是否可以隔离用于回答请求的资源?你会如何处理它?

注意:我正在探索 Java 世界(来自 Python),所以请不要假设我非常了解 Java VM 的工作原理或您使用的工具 :-)

非常感谢!

【问题讨论】:

  • 可以使用jmeter监控java进程:jmeter.apache.org
  • 有可能,Hypervisor 很慢。因此它不会反映在您的 VM 统计信息中。例如,虚拟机管理程序是否正在交换
  • 感谢 Rik 的 cmets! Jmeter 只会让我产生流量吧?但这并不能真正帮助我理解为什么有些请求需要这么长时间我猜?是的,Hypervisor 也在我的雷达上 :-)

标签: java debugging jenkins profiling


【解决方案1】:

我迟到了几年,但这似乎是一个普遍的问题,这似乎是一个合理的帖子出现在搜索中,所以我将在这里发布我的经验。

我使用以下方法调试了 Jenkins UI 缓慢:

  • 将 Jenkins 更新到最新版本,以解决我在问题跟踪器和论坛中发现的所有问题,这些问题在新版本中被标记为已修复。这并没有解决问题。

  • Linux 主机上的“top”以查看使用了哪些资源。在使用 GUI 时,它几乎一直显示“jenkins”的 CPU 负载为 100% 以上。内存似乎不是问题。

  • 内存使用量约为 4GB,因此我尝试将 Jenkins JVM 最小堆大小设置为 16GB,最大设置为 22GB(主机有 24GB)以确保内存和 GC 不是问题。并非如此,UI 一直很慢,内存使用保持在最低设置。

  • 主机上的“tcpdump”以查看它正在收到什么请求,以及 Jenkins 是否尝试轮询某些可能响应缓慢的网络资源。一些有趣的发现,但没有真正的解决方案。

  • 使用 YourKit Java profiler 对 Jenkins JVM 进行分析,同时手动不断地访问 GUI 导致缓慢效果。收集 CPU 使用、方法调用、线程调度、内存使用的转储。通过 SSH 将分析器连接到 Jenkins JVM,效果很好。

  • 从 Github 下载 Jenkins 源代码以将分析器结果与源代码相匹配,并查看代码中的这些位置在做什么。将分析器插件和 Jenkins 源代码添加到 IntelliJ IDEA 以进行调试。

我的发现:

很难查明问题,因为似乎很少见。

每个线程,分析器显示了许多线程,偶尔有高负载,但没有一致的。整个火焰图显示了大部分时间在 Thread.sleep 中用于某些插件。这似乎有点奇怪,因为睡眠不应该消耗 CPU。似乎YourKit shows 显示它以提供所用挂钟时间的整体视图。因此,请考虑过滤 Thread.sleep 以查看真正的问题。

火焰图显示了许多与其他所有内容交错的日志语句,这似乎有点可疑。查看分析器突出显示跟踪的 Jenkins 源代码,我看到 Jenkins 支持非常详细的日志记录。所以我更深入地研究了 Jenkins 日志以及如何配置它们。还考虑为探查器突出显示的部分启用跟踪(日志)以查看正在发生的事情。

这些日志是 set up 作为管理 Jenkins -> 系统日志 -> 日志记录器下的日志记录器。我发现以前在那里添加了日志记录器。这是针对一直被访问并启用了详细跟踪的 Jenkins Java 包。可能添加以跟踪某些问题,但从未删除。记住分析器的结果,它生成的日志量看起来很可疑,所以我删除了它。

在此之后,Jenkins 的性能提升到了一个不错的水平。不是即时的,但很接近。非常好。因此,在这种情况下,问题是这种过度的日志记录配置将 CPU 占用到 100% 并使 GUI 缓慢爬行(我猜是在单个主线程中运行..)。 Jenkins 的主要日志位于 /var/log/jenkins 中,它没有显示任何此日志,这也有点令人困惑,因为它是我首先查看的内容之一。

这一发现当然只是一个需要检查的潜在问题。但上述方法对我有用,并且可能更普遍有用......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多