歡迎訪問我的GitHub
這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos
K8S環境的Jenkin效能問題處理
本文是《K8S環境的Jenkin效能問題處理》的續篇,上一篇解決了Jenkins叢集中的Master節點的效能問題,但是真正執行任務的並非Master節點,而是為每個任務臨時建立的Pod,當這些Pod的效能問題決定著任務的快慢甚至成敗;
環境資訊
- 硬體:三臺CentOS 7.7伺服器
- kubernetes:1.15
- JDK:1.8
- maven:3.6.3
任務節點的效能問題
Java程式設計師常用Jenkins編譯構建Maven專案,如果構建引數用的是預設配置,很容易出現效能問題,接下來就用開源專案來重現此問題:
- 在配置Jenkins的kubernetes外掛時,按照實際硬體情況給任務pod分配的記憶體是1G,如下圖:
- 接下來從GitHub下載Flink的原始碼(1.8.3-rc3版本),然後編譯構建,本次任務對應的pipeline原始碼如下:
pipeline {
agent {
label 'my-jenkins-jenkins-slave'
}
tools {
maven 'mvn-3.6.3'
}
stages {
stage('Checkout') {
steps {
echo '從GitHub下載flink工程的原始碼(1.8.3-rc3歸檔包)'
sh 'wget https://codeload.github.com/apache/flink/tar.gz/release-1.8.3-rc3'
echo '下載結束,解壓歸檔包'
sh 'tar -zxf release-1.8.3-rc3'
}
}
stage('Build') {
steps {
echo '開始編譯構建'
sh 'cd flink-release-1.8.3-rc3 && mvn clean package -U -s /home/jenkins/settings/settings.xml'
}
}
}
}
- 在執行編譯構建任務過程中,點選下圖紅框中的灰色圓球,即可跳轉到執行任務的Pod的日誌頁面:
- 下圖就是Pod日誌頁面,紅框內顯示任務出現了異常,(此時正在執行單元測試用例)
- 如下圖紅框所示,執行任務的Pod顯示為離線狀態:
- 此時登入到kubernetes環境,檢視Pod狀態,如下圖紅框所示,執行任務的Pod狀態為OOMKilled,看來是記憶體不足導致Podl被銷燬了
第一次調節
由於Pod記憶體過小導致任務失敗,可以在Jenkins的設定頁面調節Pod記憶體,如下圖所示,這次設定到6G,注意不要超出宿主機的硬體配置:
- 重複執行一次上述任務,這一次記憶體充足因而構建成功。
觀察
由於本次任務主要是執行maven編譯構建,因此有必要了解一下maven程式的記憶體使用情況:
- 在任務執行的過程中,找到Pod對應的docker容器,ID是c6d9e1b64581
- 執行docker exec c6d9e1b64581 jps得到maven程式ID為96(名稱為Launcher的那個)
- 執行docker exec c6d9e1b64581 jmap -heap 96可以看到maven程式的JVM記憶體情況,如下圖,可見maven實際使用記憶體只有3G左右:
- 此時Pod有6G記憶體,可以通過引數設定給maven程式更多記憶體;
第二次調節
接下來嘗試設定maven程式的記憶體引數,這裡將大部分記憶體劃分給老年代試試:
- 如下圖,進入設定頁面:
- 如下圖,找到Pod Templates,新增環境變數,鍵是MAVEN_OPTS,值是-Xms5632m -Xmx5632m -Xmn512m -Xss256k,由於Pod總記憶體是6G,經過此設定後,整個Pod的系統記憶體只剩512m,其餘5632m記憶體全部劃分給maven程式,並且maven程式的年輕代只有512m,將所有記憶體都留給了老年代記憶體設定如下:
- 儲存設定後再次執行任務,先找到任務Pod對應的docker容器,再用jmap -heap命令檢視maven程式的記憶體情況,如下圖,5632m記憶體全部劃分給了maven程式,並且年輕代也控制在512m:
- 下圖是執行jstat命令檢視maven程式的GC情況,紅框中是YGC次數,藍框中是FGC次數,由於年輕代記憶體過小導致頻繁YGC,不過FGC次數不多:
通過Jenkins設定頁面,對任務的Pod以及對應的maven程式的自定義設定已經完成,希望本文能給您一些參考,幫助您根據專案的特點做針對性的調節和優化。
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos