对缓慢的 Jenkins 进行故障排除
Troubleshooting slow Jenkins
Jenkins 在查看作业页面时极度 缓慢(超过 3 分钟,使用冷磁盘缓存)。主页显示正常;问题仅出现在查看个别职位的页面时。
我认为问题是从最近更新的 Jenkins+plugins 开始的,但是我该如何解决这样的问题?
我该如何解决这样的问题?
重现问题
首先,确保您可以重现问题。它有助于测试。如果性能问题仅在缓存冷时出现,那么 clearing the disk cache(Linux 的说明)可以提供帮助。
禁用或降级插件
Jenkins 的 "Manage Plugins"(在“管理 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
。)
使用jstack
strace
监视系统调用并告诉您什么 一个进程在做什么; jstack
显示进程的调用堆栈,这有助于告诉您为什么 它正在这样做(它试图完成什么)。
jstack
需要一个 pid 并且需要 运行 作为与您正在检查的进程相同的用户。 (See here 了解更多详情。)
sudo -u jenkins jstack 591
这显示了相当多的信息:每个 Jenkins 线程的堆栈跟踪,库和框架代码的大量条目,例如请求处理程序和 XML,等等。不过,在其中的某个地方,您应该能够找到特定请求处理程序的堆栈跟踪运行宁慢和堆栈跟踪的某些部分指示它正在尝试做什么。
Jenkins 在查看作业页面时极度 缓慢(超过 3 分钟,使用冷磁盘缓存)。主页显示正常;问题仅出现在查看个别职位的页面时。
我认为问题是从最近更新的 Jenkins+plugins 开始的,但是我该如何解决这样的问题?
我该如何解决这样的问题?
重现问题
首先,确保您可以重现问题。它有助于测试。如果性能问题仅在缓存冷时出现,那么 clearing the disk cache(Linux 的说明)可以提供帮助。
禁用或降级插件
Jenkins 的 "Manage Plugins"(在“管理 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
。)
使用jstack
strace
监视系统调用并告诉您什么 一个进程在做什么; jstack
显示进程的调用堆栈,这有助于告诉您为什么 它正在这样做(它试图完成什么)。
jstack
需要一个 pid 并且需要 运行 作为与您正在检查的进程相同的用户。 (See here 了解更多详情。)
sudo -u jenkins jstack 591
这显示了相当多的信息:每个 Jenkins 线程的堆栈跟踪,库和框架代码的大量条目,例如请求处理程序和 XML,等等。不过,在其中的某个地方,您应该能够找到特定请求处理程序的堆栈跟踪运行宁慢和堆栈跟踪的某些部分指示它正在尝试做什么。