解决 Jenkins 性能缓慢的问题~转
解决 Jenkins 性能缓慢的问题
Docker中文社区
计算机技术与软件专业技术资格持证人
2 人赞同了该文章
没有什么比缓慢的持续集成系统更令人沮丧的了。它减慢了反馈循环并阻止代码快速投入生产。虽然像使用性能更好的服务器可以为您争取时间,但您最终必须投资于维持持续集成工作流程的成本。
Jenkins 是目前最流行的 CI/CD 工具之一,但随着时间的推移,用户经常会遇到滞后和响应缓慢问题。在本指南中,我将分享一些 Jenkins 性能问题的概述,以及一些无需升级硬件即可显着提高性能的技巧。
1. 为什么 Jenkins 如此受欢迎的 CI/CD 选择?
Jenkins 是一种基于 Java 的开源工具,成千上万的开发人员在数十万次安装中使用它,使其成为最受欢迎的自动化集成工具。这种广泛使用意味着很容易找到对 Jenkins 的支持和提示,但这并不是它如此广泛使用的唯一原因。
Jenkins 为 CI 工作流程带来了许多有趣的范例,包括:
- 更快的部署。在所有开发人员提交他们的代码之后,一次测试和部署构建的日子已经一去不复返了。使用 Jenkins 的自动化 CI/CD 管道,无论何时开发人员提交代码,它都会在一天中跨多个周期进行构建和测试。
- 可扩展的主代理架构。在大规模管理分布式构建时,Jenkins 可能是一个不错的选择。Jenkins 的主服务器是调度构建作业并将它们分配给代理(以前是从属)执行的主服务器。此模式允许您在一台或数百台服务器上运行 Jenkins 以加快构建速度。
- 数以千计的插件:作为一个开源平台,Jenkins 为其他开发人员构建的持续集成提供了大量插件。这允许您扩展基本功能,而无需在内部编写或维护大量额外代码。
2. 克服常见的 Jenkins 性能问题
随着时间的推移,构建频率的增加、并行运行的多个作业以及构建复杂性的增加可能会导致 Jenkins 出现性能问题。您的体验可能会因您的使用场景而异,但一些常见问题包括:
- 每次运行时构建似乎都“卡在”特定步骤的“中断”。
- 达到单个机器或主节点的内存限制。
- CPU 瓶颈会减慢构建的特定部分。
- 插件或脚本中的错误或低效代码。
- 由于这些问题可能是由多种根本原因引起的,因此很难概括解决方案,但 Jenkins 用户可能想要研究一些事情。以下是一些最通用的方法,您可以提高 Jenkins 构建性能并限制上述问题的频率。
2.1 避免在管道中使用复杂的 Groovy 脚本
Jenkins Groovy脚本控制台在主节点上执行并直接使用主资源,例如CPU和存储器。因此,建议您减少管道中 Groovy 脚本的数量和复杂性,转而可以直接使用在每个代理上运行的插件。
在 Jenkins 中要避免的最常见的 Groovy 方法是 JsonSlurper、Jenkins.getInstance 和 HttpRequest。Jenkins在其博客上有更多关于可扩展管道代码和要避免的操作的建议。
2.2 在主节点上保持最少的构建
Jenkins 的主节点位于应用程序运行的整个 CI/CD 流程的中心。因此,主节点上的构建数量会显着影响资源使用。在主节点上保持较少的构建将为代理节点留出足够的 CPU 和内存来安排和触发作业。
您可以在工作中使用“限制项目可以运行的位置”选项。虽然 Jenkins 仍将在主节点上运行轻量级执行器,但您的重量级执行器将在代理节点上运行。
将主节点视为 Jenkins 的大脑。与代理不同,主节点不能被清除或替换。因此,为确保最佳 CI/CD 功能,请考虑对 Jenkins 进行一些性能调整,并将主节点从不必要的任务中解放出来。这将为您提供足够的内存和 CPU 来有效调度和构建代理上的触发器。
2.3 不要过渡 Jenkins 主节点插件安装
DevOps 专业人员经常跨多个团队和项目工作,以完成与 CI/CD 相关的任务。如果这是您的情况,请注意不要给单个 Jenkins master 带来负担。相反,创建多个主控。多个 master 将确保为 master 分配项目特定的资源,并且您还将避免插件冲突。
此外,不要设置可能在周期中的任何地方失败的长时间构建,记住将构建分解为多个较小的作业。
2.4 轻松管理代理
在设置 Jenkins 时,正确设置代理很重要。您希望确保在时机成熟时,您可以轻松添加新代理或替换现有代理。为此,请考虑为代理创建虚拟机镜像。您也可以考虑在 Kubernetes 或Amazon EKS等可扩展集群中的Docker 容器内运行 Jenkins。
使用具有通用性的代理也是一个好主意;一个代理应该运行多个不同的作业并最大限度地利用资源。
2.5 删除构建历史
一段时间后,Jenkins 构建可能会堆积起来,磁盘消耗可能会失控。开发人员经常忽略 Jenkins 的Discard Old Builds选项。设置指标,例如构建数量和保留构建和工件的天数,位于 Jenkins Log Rotation 菜单下。
与其让旧版本累积并消耗文件系统,开发人员可以启用Discard Old Builds并在 Jenkins 作业完成后享受自动资源使用清理。您还可以使用 G1 垃圾收集器来代替 Java 8 的默认Parallel GC,因为前者是一种服务器风格的垃圾收集器,具有较低的 GC 暂停时间。
也可以通过 Jenkins 命令行手动删除构建,或者使用定期清理旧构建的cron 作业。您可以在此参考文章中找到丢弃旧构建数据的其他选项https://support.cloudbees.com/hc/en-us/articles/215549798-Deleting-Old-Builds-Best-Strategy-for-Cleanup-and-disk-space-management
。
2.6 防止并行作业中的资源冲突
并行运行的作业可能需要独占访问端口或资源。这可能会导致冲突、构建失败并进一步减慢 Jenkins 流水线。例如,如果您并行运行多个构建,则它们在访问资源时很有可能发生冲突,例如 Postgres 的数据库端口 5432。
Jenkins 提供Throttle Concurrent Builds插件来帮助调节 Jenkins 节点上的并发构建数量:
//Throttleasingleoperation throttle(['test_1']){ node(){ sh"sleep100" echo"Done" } }
2.7 控制堆大小
您想创建以性能为导向且永不会因内存泄漏或内存不足错误而失败的 CI/CD 管道吗?注意堆大小。随着 Jenkins 构建数量的增长,如果不注意默认堆大小可能会导致内存不足错误。
大多数现代 Java 应用程序在启动期间都使用最大堆大小配置。为了让 Jenkins 顺利运行,请将最大堆大小属性降低到最大4 GB。您可以随时间增加堆大小,具体取决于 Jenkins 构建。
要将堆大小设置为 4 GB:
- /etc/default/jenkins
- JAVA_ARGS="-Xmx4096m"
2.8 避免插件过载
Jenkins 拥有超过一千个可用插件,为其用户提供了许多功能来增强他们的 CI/CD 管道。但是,在向管道添加插件和外部服务时,请牢记性能。将 Jenkins 与外部服务集成通常会减慢 Jenkins UI 并导致不利影响,例如代理丢失或断开连接。
为了确定插件是否导致您的构建速度变慢,您可以尝试在禁用所有或部分插件的情况下运行构建。逐渐添加每个返回以确定导致瓶颈的原因。找到导致性能问题的插件(或插件组合)后,您有几个选择:
- 通过搜索Jenkins Plugin Index找到替换插件。
- 通过检查changelog来查看Jenkins 是否添加了对这个特性的原生支持。您可能必须升级 Jenkins 才能获得最新功能,但这通常是提高性能的好主意。
- 用自定义脚本替换插件,记住这可能会引入新的性能问题。不过,如果您安装一个复杂的插件,但只使用一两个小功能,脚本可能会更有效。
- 如果您可以没有它,请删除该插件。有时这是一个值得的权衡。
3.0 跟踪 Jenkins 性能
当您开始调整 Jenkins 性能时,您可能有兴趣添加一个插件来帮助监控和提高性能。例如,您可以利用Jenkins Monitoring 插件深入了解您的 CI/CD 管道,包括:
- 错误日志
- CPU、内存和平均系统负载图表
- 关于 HTTP 会话和 HTTP 响应时间的报告
- 构建时间和构建步骤的详细统计信息
- 所有节点的聚合堆直方图
Jenkins 性能监控工具
这可以帮助您评估性能调整的有效性,并在您继续改进 Jenkins 安装时为您提供指导。
4.0 总结
Jenkins 的响应能力问题很常见,尤其是在处理较重的构建时。损坏的 Jenkins CI/CD 管道可能会拖延您的开发团队并创建不必要的依赖项。本文中讨论的技巧应该可以帮助您显着提高 Jenkins CI/CD 管道的性能。
本文转载自:「云原生技术爱好者社区」,原文: https://mp.weixin.qq.com/s/u34d-xTZZDs53ZLfqtilxQ,版权归原作者所有。
相关文章:
解决 Jenkins 性能缓慢的问题~转
解决 Jenkins 性能缓慢的问题 Docker中文社区 计算机技术与软件专业技术资格持证人 2 人赞同了该文章 没有什么比缓慢的持续集成系统更令人沮丧的了。它减慢了反馈循环并阻止代码快速投入生产。虽然像使用性能更好的服务器可以为您争取时间,但您最终必须投资…...
Matrix卡顿优化之IdleHandlerLagTracer源码分析
前言 IdleHandler是Android系统为开发者提供的一种在消息队列空闲时运行任务的机制,通过IdleHandler执行的任务优先级低于主线程优先级,会在主线程任务执行完成后再执行,所以适用于一些实时性要求不高的任务,通常用于Android启动…...
(ubuntu)Docker 安装linux 详情过程
文章目录 前言Docker 安装linux第一步:使用dokcker 拉取镜像:第二步:创建本地目录(用于挂载)第三步:(上传配置文件)修改配置文件第四步:创建docker容器第五步: 测试本地连…...
ArcMap:第二届全国大学生GIS技能大赛(广西师范学院)详解-上午题
目录 01 题目 1.1 第一小题 1.2 第二小题 1.3 第三小题 1.4 数据展示 02 思路和实操 2.1 第一问思路 2.2 第一问操作过程 2.2.1 地理配准 2.2.2 镶嵌 2.2.2.1 第一种镶嵌方法 2.2.2.2 第二种镶嵌方法 2.2.3 裁剪 2.2.4 DEM信息提取 2.2.5 分类 2.3 第二问思路 …...
Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)
目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现,材质空白的情况(如下图所示),今天终于找到问题原因,记录下来,让大家避免踩坑。 其实原因很简…...
C++交换a和b的方法
以下是用C编写的交换a和b的六种方法: 1. 方法一:使用临时变量 #include <iostream>int main() {int a 5;int b 10;std::cout << "Before swapping: a " << a << ", b " << b << std::end…...
3D孪生场景搭建:模拟仿真
前面几期文章介绍如何使用NSDT 编辑器 搭建3D应用场景,本期介绍下孪生场景中一个一个非常重要的功能:模拟仿真。 1、什么是模拟仿真 模拟仿真是一种用于描述、分析和模拟现实世界中系统、过程或事件的计算机模型和程序。仿真通过输入各种参数和条件&am…...
美国各流域边界下载,并利用arcgis提取与处理
一、边界数据的下载 一般使用最普遍的流域边界数据是从HydroSHEDS官网下载: HydroBASINS代表一系列矢量多边形图层,以全球尺度呈现次级流域边界。该产品的目标是提供一种无缝的全球覆盖,其中包含了不同尺度(从数十到数百万平方千米…...
A Survey and Framework of Cooperative Perception 论文阅读
论文链接 A Survey and Framework of Cooperative Perception: From Heterogeneous Singleton to Hierarchical Cooperation 0. Abstract 首次提出统一的 CP(Cooperative Percepetion) 框架回顾了基于不同类型传感器的 CP 系统与分类对节点结构&#x…...
【SkyWalking】SkyWalking是如何实现跨进程传播链路数据?
文章目录 一、简介1 为什么写这篇文章2 跨进程传播协议-简介 二、协议1 Standard Header项2 Extension Header项3 Correlation Header项 三、跨进程传播协议的源码分析1 OpenTracing规范2 通过dubbo插件分析跨进程数据传播3 分析跨进程传播协议的核心源码 四、小结参考 一、简介…...
px4仿真实现无人机自主飞行
一,确定消息类型 无人机通过即在电脑是现自主飞行:思路如下。 通过Mavros功能包,将ROS消息转换为Mavlink消息。实现对无人机的控制。 几种消息之间的关系如下: 对于ROS数据,就是我们机载电脑执行ROS系统的数据。 对于Mavros消息,就是Mavros功能包内部的消息。查询网站…...
详解Linux的系统调用fork()函数
在Linux系统中,fork()是一个非常重要的系统调用,它的作用是创建一个新的进程。具体来说,fork()函数会在当前进程的地址空间中复制一份子进程,并且这个子进程几乎完全与父进程相同,包括进程代码、数据、堆栈以及打开的文…...
构建捡垃圾机器人的 ROS 2 项目
一、说明 本系列是关于学习如何使用 ROS2、Docker 和 Github 设计、设置和维护机器人项目。 先决条件 — ROS2 软件包的基本知识、实现发布者、订阅者、操作并连接它们。 我们之前在 ROS2 中了解了不同的部分。但是,在我们转向实际的基于硬件的项目之前,…...
Spring常用注解(2)
6、切面(AOP)相关注解 Spring AOP详细介绍 Spring支持AspectJ的注解式切面编程。 Aspect 声明一个切面 After 在方法执行之后执行(方法上) Before 在方法执行之前执行(方法上) Around 在方法执行之前与之后…...
upload-labs靶场通关
文章目录 Pass-01 前端检测(JS检测)1.1 原理分析1.2 实验 Pass-02 后端检测(MIME检测)2.1 原理分析2.2 实验 Pass-03 后端检测(黑名单绕过,特殊后缀名)3.1 原理分析3.2 实验 Pass-04 后端检测&a…...
git拉取代码过程
第一步:先在本地创建文件夹 ,比如我这里的文件夹名称是 fengkgong_zntjfx 第二步:执行命令:git init 第三步:git clone 第四步:git fetch 第五步:git branch -a 第六步:cd 项目 【…...
Swift | 属性包装器
Swift | 属性包装器 1. 什么是 Swift Property Wrapper? Swift Property Wrapper 是一种特性,它允许我们在声明属性时添加自定义的包装逻辑。通过使用属性包装器,我们可以在不修改类或结构体定义的情况下,定制属性的访问和存储方…...
Android改造CardView为圆形View,Kotlin
Android改造CardView为圆形View,Kotlin 可以利用androidx.cardview.widget.CardView的cardCornerRadius特性,将CardView改造成一个圆形的View,技术实现的关键首先设定CardView为一个宽高相等的View(正方形),…...
Idea下面git的使用:变基、合并、优选、还原提交、重置、回滚、补丁
多分支和分支切换 变基和合并 变基是把本项目的所有提交都列出来按顺序一个个提交到目标分支上去 而合并是把两个分支合并起来,但是旧的分支还是可以启动其他分支,在旧的分支上继续开发 master: A -- B -- C -- M/ feature: D -- Emaster: A -…...
【数据结构】什么是算法
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.算法的定义 1.算法的概念 2.数据结构与算法的关系 二.算法的特性 输入 输出 有穷性 确定性 可行性 三.算法的设计要求 1.正确性 2.可读性 3.健壮性 4.效…...
复旦大学EMBA:揭秘科创企业,领略未来战略!
智能制造,国之重器。作为制造强国建设的主攻方向,智能制造的发展水平关系到我国未来制造业在全球的地位与影响力。发展智能制造,是加快建设现代化产业体系的重要手段,提升供给体系适配性的有力抓手,也是建设数字中国的…...
根据您的数据量定制的ChatGPT,改变客户服务的方式
在当今竞争激烈的商业环境中,提供优质的客户服务对于保持忠诚的客户群和推动业务增长至关重要。客户满意度已成为各行各企业的首要任务,因为它直接影响客户留存和品牌声誉。随着技术的进步,公司不断探索创新解决方案,以增强客户服…...
《Unity Shader 入门精要》笔记03
UnityShader的内置变量(数学篇) Unity内置的变换矩阵摄像机和屏幕参数float3 _WorldSpaceCameraPosfloat4 _ProjectionParamsfloat4 _ZBufferParamsfloat4 unity_OrthoParamsfloat4x4 unity_CameraProjectionfloat4x4 unity_CameraInvProjectionfloat4 u…...
LINUX系统使用软件异地同步数据(灾备)
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步 一、宝塔环境: 有宝塔软件商城支持,参考:https://www.bt.cn/bbs/thread-98022-1-1.html 二、…...
IDEA Rogstry中找不到compiler.automake.allow.when.app.running问题解决
网上大部分人教我们 先 File > Settings 然后 勾选 Build 下的 Compiler中的 Build project automatically 这些步骤都不会有问题 然后就会让我们 ctrl shift alt / 点 Rogstry 打开后 我人就麻了 根本没有什么 compiler.automake.allow.when.app.running 也不用慌 我们…...
c#设计模式-行为型模式 之 状态模式
🚀简介 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,我们可以通过创建一个状态接口和一些实现了该接口的状态类来实现状态模式。然后,我们可以创建一个上下文类,它会根据其当前的状态对象来改…...
使用Docker安装JupyterHub
安装JupyterHub 拉取Jupyter镜像并运行容器 docker run -d -p 8000:8000 --name jupyterhub jupyterhub/jupyterhub jupyterhub # -d:后台运行 # -p 8000:8000:宿主机的8000端口映射容器中的8000端口 # --name jupyterhub:给运行的容器起名…...
SpringCloudGateway网关整合swagger3+Knife4j3,basePath丢失请求404问题
在集成 Spring Cloud Gateway 网关的时候,会出现没有 basePath 的情况,例如定义的 /jeeplus-auth、/jeeplus-system 等微服务前缀导致访问接口404: maven依赖: swagger2于17年停止维护,现在最新的版本为 Swagger3&am…...
html通过使用图像源的协议(protocol)相对 URL 来防止安全/不安全错误
有人知道使用 protocol relative URLs 是否有问题吗?用于图像源以防止混合内容安全警告。 例如链接一张图片: <img src"//domain.com/img.jpg" /> 代替: <img src"http://domain.com/img.jpg" /> or <img src"https…...
【SpringBoot】| Thymeleaf 模板引擎
目录 Thymeleaf 模板引擎 1. 第一个例子 2. 表达式 ①标准变量表达式 ②选择变量表达式(星号变量表达式) ③链接表达式(URL表达式) 3. Thymeleaf的属性 ①th:action ②th:method ③th:href ④th:src ⑤th:text ⑥th:…...
wordpress一键分享代码/百度关键词点击器
本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。 DELETE products PUT products {"settings": {"number_of_shards": 1} }POST /products/_bulk { "index": { "_id": 1 }} { "prod…...
网站主题 模板/下载百度安装
最近做了个项目,该项目可以方便查询全国地铁线路,地铁线路上模拟小车到站提醒,点击小车可触发相关事件,使用的有 百度地图查询地铁线路 ,地铁图api,再结合vue-baidu-map 1.判断地铁线路图加载完成 //会有…...
文具网站建设策划书/关键词完整版免费听
1、计算机的存储单位有哪些呢?git计算机存储单位通常用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,spa2、他们换算关系是怎样的呢?blog一、计…...
模板网站怎么建设/连云港网站seo
1 Push SSL Certificate证书可以由admin角色生成,但是安装只能由agent安装,给provider的pem文件所用到的p12文件,也只能由agent导入后生成 以后发现角色相关问题,会继续整理汇总在这里。。。 转载于:https://www.cnblogs.com/Big…...
网站编程用什么语言好/杭州seo按天计费
Python知识(6)--numpy做矩阵运算 矩阵运算 论numpy中matrix 和 array的区别:http://blog.csdn.net/vincentlipan/article/details/20717163 matrix 和 array的差别: Numpy matrices必须是2维的,但是 numpy arrays (ndarrays) 可以是多维的(1D…...
wordpress去除无用标签/百度怎么搜索关键词
在使用FTP向服务器传送问文件的时候,要注意选择传输模式,如果服务器用的是linux,那么一定要选二进制模式,否则传送文件的时候会出错转载于:https://blog.51cto.com/wll2015/1655774...