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) 练习题与实操#
-
练习:构建队列优化
- 将 Controller 执行器设为 0,仅调度;
- 新增 2 个 Agent;
- 比较执行前后构建队列长度变化。 -
练习:缓存加速验证
- 为 Maven/NPM 配置缓存目录;
- 记录首次与二次构建耗时差异。 -
练习:GC 分析
- 开启 GC 日志;
- 统计 24 小时 Full GC 次数与总停顿时间;
- 输出优化建议。
通过“监控—定位—优化—验证”的闭环流程,可逐步消除性能瓶颈,并在团队规模增长时保持 Jenkins 的稳定与高效。