K8S環境的Jenkin效能問題處理續篇(任務Pod設定)

程式設計師欣宸發表於2022-11-24

歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos

K8S環境的Jenkin效能問題處理

本文是《K8S環境的Jenkin效能問題處理》的續篇,上一篇解決了Jenkins叢集中的Master節點的效能問題,但是真正執行任務的並非Master節點,而是為每個任務臨時建立的Pod,當這些Pod的效能問題決定著任務的快慢甚至成敗;

環境資訊

  1. 硬體:三臺CentOS 7.7伺服器
  2. kubernetes:1.15
  3. JDK:1.8
  4. 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

相關文章