在查看作业页面时,Jenkins 非常慢(超过3分钟,使用冷磁盘缓存)。主页显示正常;问题仅在查看单个作业的页面时。
我认为问题始于Jenkins +插件的最新更新,但我该如何解决这样的问题?
如何解决此类问题?
答案 0 :(得分:7)
首先,确保您可以重现问题。它有助于测试。如果只在缓存冷却时出现性能问题,那么clearing the disk cache(适用于Linux的说明)可以提供帮助。
詹金斯' "管理插件" (在Manage Jenkins部分下)允许您单独禁用和降级插件。如果您怀疑特定插件导致问题,这可以帮助您确认。
strace
可以显示Jenkins正在进行的系统调用。首先,获取主要的Jenkins PID:
root@server:~# ps -ef | grep jenkins
jenkins 589 1 0 17:03 ? 00:00:00 /usr/bin/daemon --name=jenkins --inherit --env=JENKINS_HOME=/home/jenkins --output=/var/log/jenkins/jenkins.log --pidfile=/var/run/jenkins/jenkins.pid --umask=027 -- /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=-1
jenkins 591 589 7 17:03 ? 00:00:51 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=-1
(在这种情况下,pid是591。)
接下来,运行strace。由于Jenkins是多线程的,因此您需要添加-f
来跟踪所有线程。
strace -p 591 -f
如果你很幸运,你会发现一个明显的减速原因。 (在我的情况下,其中一个主题是为我正在尝试查看的特定工作重复打开每个以前版本的build.xml
。)
strace
监控系统调用并告诉您进程正在执行的操作; jstack
显示进程的调用堆栈,这有助于告诉您为什么正在执行此操作(它正在尝试完成的任务)。
jstack
需要一个pid,需要以与您正在检查的流程相同的用户身份运行。 (See here了解更多详情。)
sudo -u jenkins jstack 591
这显示了很多信息:每个Jenkins的堆栈跟踪'线程,库和框架代码的众多条目,例如请求处理程序和XML等。但是,在那里,您应该能够找到特定请求处理程序的堆栈跟踪,该处理程序运行缓慢且某些部分堆栈跟踪,指示它正在尝试做什么。