如何解决Jenkins UI的缓慢问题?

时间:2017-06-12 11:07:33

标签: java debugging jenkins profiling

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

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

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

  1. 检查主机的一般统计数据(cpu,ram等)。一切看起来还不错。
  2. 检查了Java VM的统计信息。内存使用对我来说没问题。
  3. 设置更好的监控以跟踪传入请求的nb,处理它们的时间和状态代码。这确实显示某些请求被延迟(最多10分钟)。
  4. 我已经从互联网上阅读了许多有趣的内容,包括:Jenkins GUI only shown after waiting for 2 minutes。在这种情况下,信息有点旧(过时?),因为我的工作只保留有限数量的构建,它没有多大帮助。

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

    我留下了许多假设,例如:

    1. 我使用了很多分类视图(使用regexp),也许它效率低下?但它似乎不足以解释延迟的时间。
    2. 只有第一页加载很长的事实让我得到了一些缓存。但它是否缓存html?凭证?等
    3. 目前,这些只是猜测。 理想情况下,我想以某种方式分析服务器回答请求所花费的时间。从那里尝试找到这个时间去的地方。

      这有可能吗?我尝试过使用VisualVM,但这只显示全局数据吗?是否可以隔离用于回答请求的资源?你会怎么做?

      注意:我发现了Java世界(来自Python)所以请不要假设我很清楚Java VM的工作原理或使用的工具: - )

      非常感谢!

1 个答案:

答案 0 :(得分:0)

我参加聚会晚了几年,但这似乎是一个普遍的问题,而且在搜索中似乎是一个合理的帖子,所以我将在这里发表自己的经验。

我使用以下命令调试了Jenkins UI的慢度:

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

  • Linux主机上的
  • “ top”以查看使用了哪些资源。使用GUI时,几乎所有时间都显示“詹金斯”的CPU负载超过100%。记忆似乎不是问题。

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

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

  • 使用YourKit Java探查器对Jenkins JVM进行探查,同时手动连续访问GUI导致速度缓慢。收集CPU使用量,方法调用,线程调度,内存使用的转储。通过SSH将事件探查器连接到Jenkins JVM,效果很好。

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

我的发现:

很难发现问题,因为可见性很小。

对于每个线程,探查器显示出许多线程,偶有高负载,但不一致。总体火焰图显示,大部分插件在Thread.sleep中花费的时间很大。这似乎有点奇怪,因为睡眠不应消耗CPU。似乎YourKit shows对其进行了显示,以提供所用挂钟时间的整体视图。因此,考虑将Thread.sleep过滤掉以查看实际问题。

火焰图显示许多记录语句与其他所有内容交织在一起,这似乎有些可疑。在查看分析器突出显示的跟踪的Jenkins源代码时,我看到Jenkins支持非常详细的日志记录。因此,我进一步研究了Jenkins日志以及如何配置它们。还考虑过为探查器突出显示的部分启用跟踪(日志),以查看发生了什么。

这些日志是set up作为Manage Jenkins-> System Log-> Log Recorders下的日志记录器。我发现以前在那里添加了日志记录器。这是针对Jenkins Java软件包的,该软件包一直被访问并且启用了详细的跟踪。可能添加以跟踪某些问题,但从未删除。记住分析器的结果,它似乎怀疑它生成的日志数量,因此我将其删除。

此后,詹金斯的表现提高到了一个不错的水平。不是很即时,而是接近。非常好。因此,在这种情况下,问题是这种过多的日志记录配置将CPU占用了100%的速度,并拖慢了GUI进行爬网的速度(我猜是在单个主线程中运行)。 Jenkins的主要日志位于/ var / log / jenkins中,并且未显示任何该日志,这也有点令人困惑,因为它是我首先查看的内容之一。

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