jenkins - 解决 Jenkins 缓慢问题

标签 jenkins jenkins-plugins

Jenkins 在查看作业页面时极其慢(超过 3 分钟,使用冷磁盘缓存)。主页面显示良好;仅当查看单个作业的页面时才会出现问题。

认为问题是由最近更新的 Jenkins+插件引起的,但是我该如何解决这样的问题呢?

如何解决此类问题?

最佳答案

重现问题

首先,确保您可以重现该问题。它有助于测试。如果性能问题仅在缓存冷时出现,则 clearing the disk cache (Linux 说明)可以提供帮助。

禁用或降级插件

Jenkins 的“管理插件”(在“管理 Jenkins”部分下)允许您单独禁用和降级插件。如果您怀疑某个特定插件导致了问题,这可以帮助您确认。

使用strace

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 - 解决 Jenkins 缓慢问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35444152/

相关文章:

version-control - Jenkins 轮询 scm 选项以忽略某些文件更改

ssh - 服务器 ip 上的 Jenkins ssh 作为构建参数传递

jenkins - 如何获取当前阶段的控制台日志?

jenkins - Jenkins 构建步骤超时

java - Jenkins 不过滤 Maven 构建的全局密码

jenkins - 如何在 Windows 上重新启动 Jenkins?

docker - 使用 Jenkinsfile 让容器运行

linux - SSH - 帮助理解代理命令

Jenkins ArtifactDeployer 插件 - 如何将本地目录指定为远程目录

groovy - 如何记住 Jenkins/Hudson 上次构建时使用的参数值