主从架构与性能调优
构建多了,Jenkins 的瓶颈从"功能"变成"性能":构建排队、Master 卡顿、磁盘爆满、GC 频繁。本篇按"Master → Agent → 构建 → 存储"顺序给出优化方向。
本篇目标:能合理规划执行器与 Agent,诊断排队和磁盘问题,配置资源隔离与监控指标。
1. 先分清瓶颈在哪
构建慢 / 排队
├── 无可用 Executor? → Agent 不足 / 并发受限
├── Master 响应慢? → Master 资源被挤占、JVM 内存不足
├── 磁盘快满? → Workspace / 构建记录 / 日志堆积
└── 单个构建本身就慢? → 构建脚本 / 依赖下载
用 Manage Jenkins → System Info 和 Load Statistics 观察负载,配合监控(见第 5 节)定位。
2. Agent 规划
2.1 执行器数量
| 节点 | 建议执行器数 |
|---|---|
| 内置节点(Master) | 0(或极少数轻量管理 Job) |
| 专用构建机(8C16G) | 2-4 |
| K8s 动态 Agent | 按 Pod 模板配额,不必在 Cloud 上堆执行器 |
执行器不是越多越好——过多会让每台 Agent 的构建互相抢资源,排队反而更慢。给每个 Agent 设合理的 # of executors,并在系统层面限制。
2.2 Agent 标签与隔离
标签规划:
linux-x86_64 # 平台
jdk17 / jdk11 # Java 版本
gpu # GPU 构建
high-memory # 内存型任务
流水线用标签选择 Agent:
agent { label 'linux && jdk17' }
3. Master 调优
3.1 JVM 内存
Jenkins 以 JVM 运行。调整启动参数(容器场景改环境变量):
# docker-compose 或 Helm values
environment:
JAVA_OPTS: >-
-Xms2g
-Xmx4g
-XX:MaxMetaspaceSize=512m
-Djenkins.security.ignoreExtraProperties=true
要点:
-Xmx根据实例内存设定,留足给 OS 和 Agent 进程;- 频繁 Full GC 时用
-Xlog:gc(JDK17)看日志,再决定加不加内存; - Master 只做调度,构建全部放 Agent,Master 内存压力会小很多。
3.2 并发与队列
- 开启 并发构建:Job 配置
Concurrent Builds允许同一 Job 并行(注意资源); - 限制全局并发:
Manage Jenkins → System → Global properties → Concurrent build count; - 队列卡住时,查看 Manage Jenkins → Load Statistics,找出一直占用的 Executor。
4. 磁盘与构建清理
4.1 三大磁盘占用源
| 占用 | 清理手段 |
|---|---|
| Workspaces | post { always { cleanWs() } },或定期批量清理 |
| 构建记录 | buildDiscarder(logRotator(...)) 保留策略 |
| 归档产物 | 大产物进制品仓库,Master 只留诊断包 |
| 插件 / 日志 | 定期清 $JENKINS_HOME/logs,插件做更新前清理 |
4.2 全局保留策略
// 每个 Job 建议加,或在 Job 配置中设置
options {
buildDiscarder(logRotator(daysToKeepStr: '30', numToKeepStr: '30'))
}
4.3 磁盘监控
# 监控 $JENKINS_HOME 使用率
df -h /var/jenkins_home
du -sh /var/jenkins_home/* | sort -rh | head
超过 80% 应触发告警(Prometheus node_filesystem 指标),见监控手册。
5. 监控 Jenkins 性能指标
安装 Prometheus 插件,暴露 /prometheus 端点:
Manage Jenkins → Plugins → 安装 Prometheus Metrics 插件
访问 https://ci.example.com/prometheus
关键指标:
| 指标 | 反映 |
|---|---|
default_jenkins_node_online | Agent 是否在线 |
jenkins_node_available_children | 可用执行器 |
jenkins_queue_size_value | 队列长度(>0 说明在排队) |
jenkins_build_duration_milliseconds | 构建时长 |
jenkins_build_result_ordinal | 构建结果分布 |
jenkins_jvm_memory_usage | Master JVM 内存 |
# 队列持续不为空告警
jenkins_queue_size_value > 0
# 离线 Agent 告警
default_jenkins_node_online == 0
6. 性能优化清单
- Master 内置节点执行器设为 0,构建全部走 Agent
- Agent 执行器数按资源合理设置,用标签做资源隔离
- 每个 Job 配
buildDiscarder保留策略 - 每个 Job 的
post { always { cleanWs() } } - 大产物进制品仓库,不堆 Master
- 配置 Prometheus 插件并监控队列、Agent、JVM 指标
- 磁盘使用率 >80% 有告警
7. 练习与验收
练习 A
- 查看当前所有 Agent 的执行器和负载,找出是否有排队 Job
- 给一个 Job 配置
buildDiscarder和cleanWs,观察磁盘占用变化 - 安装 Prometheus 插件,访问
/prometheus确认指标输出
练习 B
- 用标签区分两个 Agent 池(如
jdk17/jdk11),让不同流水线选择对应 Agent - 用
LOAD_STATISTICS页面找出构建高峰时段 - 给 Master 配置 JVM 参数(-Xmx),重启观察内存变化
验收清单
- 能定位构建排队/慢的瓶颈在 Agent、Master、磁盘还是构建本身
- 会规划执行器数量和 Agent 标签隔离
- 知道 Master JVM 内存调优要点
- 会配置构建记录/Workspace/产物清理
- 会用 Prometheus 指标监控队列、Agent、JVM
下一篇:高可用与备份恢复。