18.9.4 性能瓶颈与资源优化实践

围绕 Jenkins 性能瓶颈与资源优化,需在“主控—Agent—存储—网络—插件”五个维度建立可观测与可执行的闭环。以下给出原理草图、安装与监控配置、排错命令、优化示例与练习。

文章图片

1) 监控安装与基线建立(示例)#

以 Linux 服务方式部署的 Jenkins 为例,开启 GC 日志与监控采集,建立性能基线。

Jenkins 服务 JVM 参数(示例路径)

# /etc/default/jenkins 或 /etc/sysconfig/jenkins
JENKINS_JAVA_OPTIONS="-Xms4g -Xmx4g -XX:+UseG1GC \
 -Xlog:gc*:file=/var/log/jenkins/gc.log:time,level,tags \
 -Djava.awt.headless=true"

重启服务并验证

sudo systemctl restart jenkins
sudo systemctl status jenkins --no-pager
# 预期:Active: active (running)

监控采集(示例:使用 node_exporter + 关键指标)

# 采集系统指标
node_exporter --collector.systemd --collector.filesystem --collector.meminfo

# 快速观测主机资源
top -H -p $(pgrep -f jenkins.war)
iostat -x 1 5
df -h /var/lib/jenkins

2) 性能瓶颈快速定位(排错命令)#

主控 CPU/内存/GC

# 线程栈分析(定位高CPU线程)
pid=$(pgrep -f jenkins.war)
top -H -p $pid
jstack $pid > /tmp/jenkins.jstack

# GC 统计(确认Full GC频率与停顿)
grep -E "Pause|Full" /var/log/jenkins/gc.log | tail -n 20

构建队列与执行器

# 通过 Jenkins Script Console 执行
# /script 页面
println("Queue size: " + jenkins.model.Jenkins.instance.queue.items.size())
println("Executors: " + jenkins.model.Jenkins.instance.numExecutors)

磁盘与I/O

# Jenkins Home I/O
iotop -oPa
du -sh /var/lib/jenkins/jobs/* | sort -h | tail

网络与外部依赖

# Git/制品库连通性与延迟
curl -I https://git.example.com
curl -I https://nexus.example.com

# DNS与网络瓶颈检查
dig git.example.com
mtr -r -c 10 git.example.com

3) 主控资源优化(示例)#

优化目标:减少主控构建、降低 GC 压力、控制并发与历史堆积

  • JVM 堆内存 Xms/Xmx 一致;启用 G1GC
  • 减少主控构建,强制将任务下沉到 Agent
  • 限制并发执行器与队列
  • 清理旧构建与工作空间

配置执行器(Controller)

# Jenkins 管理界面:
# Manage Jenkins -> Configure System -> # of executors
# 建议: 主控设置为 0-2,仅用于调度

定期清理工作空间(示例 pipeline)

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        sh 'make build'
      }
    }
  }
  post {
    always {
      cleanWs(deleteDirs: true, notFailBuild: true)
    }
  }
}

禁用不必要插件(排错手册)

# /var/lib/jenkins/plugins
# 先备份,再禁用问题插件
cd /var/lib/jenkins/plugins
mv conflict-plugin.hpi conflict-plugin.hpi.disabled
sudo systemctl restart jenkins

4) Agent 与流水线优化(示例)#

目标:隔离构建资源、提升并行度、使用缓存

Docker Agent 示例(安装与配置)

# 安装 docker
sudo yum install -y docker
sudo systemctl enable --now docker

# Jenkins 节点配置 -> Docker
# 添加云 -> Docker -> Docker Host URI: unix:///var/run/docker.sock

缓存加速示例(Maven/Gradle/NPM)

pipeline {
  agent { label 'linux' }
  environment {
    MAVEN_OPTS = "-Dmaven.repo.local=/cache/m2"
    NPM_CONFIG_CACHE = "/cache/npm"
  }
  stages {
    stage('Deps') {
      steps {
        sh 'mvn -v'
        sh 'npm ci'
      }
    }
  }
}

并行构建示例

pipeline {
  agent any
  stages {
    stage('Parallel Build') {
      parallel {
        stage('unit-test') { steps { sh 'make test' } }
        stage('lint')      { steps { sh 'make lint' } }
      }
    }
  }
}

5) 存储与制品优化(示例)#

目标:降低 Jenkins Home I/O、缩短制品上传/下载

制品库生命周期策略(示意)

# Nexus/Artifactory: 清理策略示意(伪配置)
# keep last 30 builds, delete older than 30d

归档与压缩(示例)

post {
  success {
    sh 'tar -czf dist.tar.gz dist/'
    archiveArtifacts artifacts: 'dist.tar.gz', fingerprint: true
  }
}

Jenkins Home 磁盘优化

# 建议将 /var/lib/jenkins 放到 SSD 或独立磁盘
sudo mount -t ext4 /dev/sdb1 /var/lib/jenkins
# /etc/fstab 持久化挂载

6) 网络与外部依赖优化(示例)#

目标:降低拉取依赖的网络延迟、减少外部阻塞

就近镜像加速(示例)

# /etc/docker/daemon.json
{
  "registry-mirrors": ["https://mirror.example.com"]
}

超时与重试(示例)

stage('Git Checkout') {
  options { timeout(time: 10, unit: 'MINUTES') }
  steps {
    retry(2) {
      checkout scm
    }
  }
}

7) 性能问题典型场景与排错清单#

  • 队列堆积:检查执行器数与 Agent 在线状态
  • Full GC 频繁:提高 Xmx 或降低并发与插件数量
  • 构建慢:检查外部依赖延迟、缓存缺失与流水线串行阶段
  • I/O 占满:清理工作空间与历史制品,提升磁盘性能

快速排错脚本(示例)

#!/usr/bin/env bash
# /usr/local/bin/jenkins_perf_check.sh
pid=$(pgrep -f jenkins.war)
echo "[CPU/MEM]"; ps -p $pid -o %cpu,%mem,cmd
echo "[DISK]"; df -h /var/lib/jenkins
echo "[QUEUE] Use Jenkins Script Console"

8) 练习题与实操#

  1. 练习:构建队列优化
    - 将 Controller 执行器设为 0,仅调度;
    - 新增 2 个 Agent;
    - 比较执行前后构建队列长度变化。

  2. 练习:缓存加速验证
    - 为 Maven/NPM 配置缓存目录;
    - 记录首次与二次构建耗时差异。

  3. 练习:GC 分析
    - 开启 GC 日志;
    - 统计 24 小时 Full GC 次数与总停顿时间;
    - 输出优化建议。

通过“监控—定位—优化—验证”的闭环流程,可逐步消除性能瓶颈,并在团队规模增长时保持 Jenkins 的稳定与高效。