解決 Jenkins 性能緩慢的問題
Docker中文社區(qū)
??
計算機技術(shù)與軟件專業(yè)技術(shù)資格持證人
2 人贊同了該文章
沒有什么比緩慢的持續(xù)集成系統(tǒng)更令人沮喪的了。它減慢了反饋循環(huán)并阻止代碼快速投入生產(chǎn)。雖然像使用性能更好的服務(wù)器可以為您爭取時間,但您最終必須投資于維持持續(xù)集成工作流程的成本。
Jenkins 是目前最流行的 CI/CD 工具之一,但隨著時間的推移,用戶經(jīng)常會遇到滯后和響應(yīng)緩慢問題。在本指南中,我將分享一些 Jenkins 性能問題的概述,以及一些無需升級硬件即可顯著提高性能的技巧。
1. 為什么 Jenkins 如此受歡迎的 CI/CD 選擇?
Jenkins 是一種基于 Java 的開源工具,成千上萬的開發(fā)人員在數(shù)十萬次安裝中使用它,使其成為最受歡迎的自動化集成工具。這種廣泛使用意味著很容易找到對 Jenkins 的支持和提示,但這并不是它如此廣泛使用的唯一原因。
Jenkins 為 CI 工作流程帶來了許多有趣的范例,包括:
- 更快的部署。在所有開發(fā)人員提交他們的代碼之后,一次測試和部署構(gòu)建的日子已經(jīng)一去不復(fù)返了。使用 Jenkins 的自動化 CI/CD 管道,無論何時開發(fā)人員提交代碼,它都會在一天中跨多個周期進(jìn)行構(gòu)建和測試。
- 可擴展的主代理架構(gòu)。在大規(guī)模管理分布式構(gòu)建時,Jenkins 可能是一個不錯的選擇。Jenkins 的主服務(wù)器是調(diào)度構(gòu)建作業(yè)并將它們分配給代理(以前是從屬)執(zhí)行的主服務(wù)器。此模式允許您在一臺或數(shù)百臺服務(wù)器上運行 Jenkins 以加快構(gòu)建速度。
- 數(shù)以千計的插件:作為一個開源平臺,Jenkins 為其他開發(fā)人員構(gòu)建的持續(xù)集成提供了大量插件。這允許您擴展基本功能,而無需在內(nèi)部編寫或維護(hù)大量額外代碼。
2. 克服常見的 Jenkins 性能問題
隨著時間的推移,構(gòu)建頻率的增加、并行運行的多個作業(yè)以及構(gòu)建復(fù)雜性的增加可能會導(dǎo)致 Jenkins 出現(xiàn)性能問題。您的體驗可能會因您的使用場景而異,但一些常見問題包括:
- 每次運行時構(gòu)建似乎都“卡在”特定步驟的“中斷”。
- 達(dá)到單個機器或主節(jié)點的內(nèi)存限制。
- CPU 瓶頸會減慢構(gòu)建的特定部分。
- 插件或腳本中的錯誤或低效代碼。
- 由于這些問題可能是由多種根本原因引起的,因此很難概括解決方案,但 Jenkins 用戶可能想要研究一些事情。以下是一些最通用的方法,您可以提高 Jenkins 構(gòu)建性能并限制上述問題的頻率。
2.1 避免在管道中使用復(fù)雜的 Groovy 腳本
Jenkins Groovy腳本控制臺在主節(jié)點上執(zhí)行并直接使用主資源,例如CPU和存儲器。因此,建議您減少管道中 Groovy 腳本的數(shù)量和復(fù)雜性,轉(zhuǎn)而可以直接使用在每個代理上運行的插件。
在 Jenkins 中要避免的最常見的 Groovy 方法是 JsonSlurper、Jenkins.getInstance 和 HttpRequest。Jenkins在其博客上有更多關(guān)于可擴展管道代碼和要避免的操作的建議。
2.2 在主節(jié)點上保持最少的構(gòu)建
Jenkins 的主節(jié)點位于應(yīng)用程序運行的整個 CI/CD 流程的中心。因此,主節(jié)點上的構(gòu)建數(shù)量會顯著影響資源使用。在主節(jié)點上保持較少的構(gòu)建將為代理節(jié)點留出足夠的 CPU 和內(nèi)存來安排和觸發(fā)作業(yè)。
您可以在工作中使用“限制項目可以運行的位置”選項。雖然 Jenkins 仍將在主節(jié)點上運行輕量級執(zhí)行器,但您的重量級執(zhí)行器將在代理節(jié)點上運行。
將主節(jié)點視為 Jenkins 的大腦。與代理不同,主節(jié)點不能被清除或替換。因此,為確保最佳 CI/CD 功能,請考慮對 Jenkins 進(jìn)行一些性能調(diào)整,并將主節(jié)點從不必要的任務(wù)中解放出來。這將為您提供足夠的內(nèi)存和 CPU 來有效調(diào)度和構(gòu)建代理上的觸發(fā)器。
2.3 不要過渡 Jenkins 主節(jié)點插件安裝
DevOps 專業(yè)人員經(jīng)??缍鄠€團(tuán)隊和項目工作,以完成與 CI/CD 相關(guān)的任務(wù)。如果這是您的情況,請注意不要給單個 Jenkins master 帶來負(fù)擔(dān)。相反,創(chuàng)建多個主控。多個 master 將確保為 master 分配項目特定的資源,并且您還將避免插件沖突。
此外,不要設(shè)置可能在周期中的任何地方失敗的長時間構(gòu)建,記住將構(gòu)建分解為多個較小的作業(yè)。
2.4 輕松管理代理
在設(shè)置 Jenkins 時,正確設(shè)置代理很重要。您希望確保在時機成熟時,您可以輕松添加新代理或替換現(xiàn)有代理。為此,請考慮為代理創(chuàng)建虛擬機鏡像。您也可以考慮在 Kubernetes 或Amazon EKS等可擴展集群中的Docker 容器內(nèi)運行 Jenkins。
使用具有通用性的代理也是一個好主意;一個代理應(yīng)該運行多個不同的作業(yè)并最大限度地利用資源。
2.5 刪除構(gòu)建歷史
一段時間后,Jenkins 構(gòu)建可能會堆積起來,磁盤消耗可能會失控。開發(fā)人員經(jīng)常忽略 Jenkins 的Discard Old Builds選項。設(shè)置指標(biāo),例如構(gòu)建數(shù)量和保留構(gòu)建和工件的天數(shù),位于 Jenkins Log Rotation 菜單下。
與其讓舊版本累積并消耗文件系統(tǒng),開發(fā)人員可以啟用Discard Old Builds并在 Jenkins 作業(yè)完成后享受自動資源使用清理。您還可以使用 G1 垃圾收集器來代替 Java 8 的默認(rèn)Parallel GC,因為前者是一種服務(wù)器風(fēng)格的垃圾收集器,具有較低的 GC 暫停時間。
也可以通過 Jenkins 命令行手動刪除構(gòu)建,或者使用定期清理舊構(gòu)建的cron 作業(yè)。您可以在此參考文章中找到丟棄舊構(gòu)建數(shù)據(jù)的其他選項https://support.cloudbees.com/hc/en-us/articles/215549798-Deleting-Old-Builds-Best-Strategy-for-Cleanup-and-disk-space-management
。
2.6 防止并行作業(yè)中的資源沖突
并行運行的作業(yè)可能需要獨占訪問端口或資源。這可能會導(dǎo)致沖突、構(gòu)建失敗并進(jìn)一步減慢 Jenkins 流水線。例如,如果您并行運行多個構(gòu)建,則它們在訪問資源時很有可能發(fā)生沖突,例如 Postgres 的數(shù)據(jù)庫端口 5432。
Jenkins 提供Throttle Concurrent Builds插件來幫助調(diào)節(jié) Jenkins 節(jié)點上的并發(fā)構(gòu)建數(shù)量:
//Throttleasingleoperation throttle(['test_1']){ node(){ sh"sleep100" echo"Done" } }
2.7 控制堆大小
您想創(chuàng)建以性能為導(dǎo)向且永不會因內(nèi)存泄漏或內(nèi)存不足錯誤而失敗的 CI/CD 管道嗎?注意堆大小。隨著 Jenkins 構(gòu)建數(shù)量的增長,如果不注意默認(rèn)堆大小可能會導(dǎo)致內(nèi)存不足錯誤。
大多數(shù)現(xiàn)代 Java 應(yīng)用程序在啟動期間都使用最大堆大小配置。為了讓 Jenkins 順利運行,請將最大堆大小屬性降低到最大4 GB。您可以隨時間增加堆大小,具體取決于 Jenkins 構(gòu)建。
要將堆大小設(shè)置為 4 GB:
- /etc/default/jenkins
- JAVA_ARGS="-Xmx4096m"
2.8 避免插件過載
Jenkins 擁有超過一千個可用插件,為其用戶提供了許多功能來增強他們的 CI/CD 管道。但是,在向管道添加插件和外部服務(wù)時,請牢記性能。將 Jenkins 與外部服務(wù)集成通常會減慢 Jenkins UI 并導(dǎo)致不利影響,例如代理丟失或斷開連接。
為了確定插件是否導(dǎo)致您的構(gòu)建速度變慢,您可以嘗試在禁用所有或部分插件的情況下運行構(gòu)建。逐漸添加每個返回以確定導(dǎo)致瓶頸的原因。找到導(dǎo)致性能問題的插件(或插件組合)后,您有幾個選擇:
- 通過搜索Jenkins Plugin Index找到替換插件。
- 通過檢查changelog來查看Jenkins 是否添加了對這個特性的原生支持。您可能必須升級 Jenkins 才能獲得最新功能,但這通常是提高性能的好主意。
- 用自定義腳本替換插件,記住這可能會引入新的性能問題。不過,如果您安裝一個復(fù)雜的插件,但只使用一兩個小功能,腳本可能會更有效。
- 如果您可以沒有它,請刪除該插件。有時這是一個值得的權(quán)衡。
3.0 跟蹤 Jenkins 性能
當(dāng)您開始調(diào)整 Jenkins 性能時,您可能有興趣添加一個插件來幫助監(jiān)控和提高性能。例如,您可以利用Jenkins Monitoring 插件深入了解您的 CI/CD 管道,包括:
- 錯誤日志
- CPU、內(nèi)存和平均系統(tǒng)負(fù)載圖表
- 關(guān)于 HTTP 會話和 HTTP 響應(yīng)時間的報告
- 構(gòu)建時間和構(gòu)建步驟的詳細(xì)統(tǒng)計信息
- 所有節(jié)點的聚合堆直方圖
Jenkins 性能監(jiān)控工具
這可以幫助您評估性能調(diào)整的有效性,并在您繼續(xù)改進(jìn) Jenkins 安裝時為您提供指導(dǎo)。
文章來源:http://www.zghlxwxcb.cn/news/detail-774086.html
4.0 總結(jié)
Jenkins 的響應(yīng)能力問題很常見,尤其是在處理較重的構(gòu)建時。損壞的 Jenkins CI/CD 管道可能會拖延您的開發(fā)團(tuán)隊并創(chuàng)建不必要的依賴項。本文中討論的技巧應(yīng)該可以幫助您顯著提高 Jenkins CI/CD 管道的性能。文章來源地址http://www.zghlxwxcb.cn/news/detail-774086.html
本文轉(zhuǎn)載自:「云原生技術(shù)愛好者社區(qū)」,原文: https://mp.weixin.qq.com/s/u34d-xTZZDs53ZLfqtilxQ,版權(quán)歸原作者所有。
到了這里,關(guān)于解決 Jenkins 性能緩慢的問題~轉(zhuǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!