我正在尝试解决问题,我希望你可以帮我解决这个问题:)希望这也可以让其他人受益。
我正在运行Jenkins服务器(v2.46.2)。 出于某些原因,在浏览Web UI时,某些请求非常慢(最多10分钟)。在第一次加载UI时似乎尤其如此。然后,它通常非常敏感。 如果您等待10/15分钟,第一个请求将再次非常缓慢。然后相当快一段时间。
你将如何解决这个问题? 到目前为止,这就是我所做的:
我已经从互联网上阅读了许多有趣的内容,包括:Jenkins GUI only shown after waiting for 2 minutes。在这种情况下,信息有点旧(过时?),因为我的工作只保留有限数量的构建,它没有多大帮助。
此博客文章也非常有趣:https://jenkins.io/blog/2016/11/21/gc-tuning/。就我而言,我不相信问题来自垃圾收集。
我留下了许多假设,例如:
目前,这些只是猜测。 理想情况下,我想以某种方式分析服务器回答请求所花费的时间。从那里尝试找到这个时间去的地方。
这有可能吗?我尝试过使用VisualVM,但这只显示全局数据吗?是否可以隔离用于回答请求的资源?你会怎么做?
注意:我发现了Java世界(来自Python)所以请不要假设我很清楚Java VM的工作原理或使用的工具: - )
非常感谢!
答案 0 :(得分:0)
我参加聚会晚了几年,但这似乎是一个普遍的问题,而且在搜索中似乎是一个合理的帖子,所以我将在这里发表自己的经验。
我使用以下命令调试了Jenkins UI的慢度:
将Jenkins更新到最新版本,以解决我在问题跟踪器和论坛中发现的所有问题,并在较新版本中将其标记为已修复。这没有解决。
“ 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中,并且未显示任何该日志,这也有点令人困惑,因为它是我首先查看的内容之一。
这个发现当然只是一个潜在的问题要检查。但是上述方法对我有用,并且可能更有用...