K8S環境的Jenkin性能問題處理

環境信息

在K8S環境經過helm部署了Jenkins(namespace爲helm-jenkins),用於平常Java項目構建:java

  1. kubernetes:1.15
  2. jenkins:2.190.2
  3. helm版本:2.16.1

若是您想了解helm部署Jenkins的詳情,請參考《》node

問題描述

在Jenkins任務密集時,Jenkins頁面響應緩慢,偶爾有白屏狀況發生(稍後自動回覆),並且構建速度也明顯變緩,查看具體的數據:git

  1. K8S環境已裝了metrics-server,用命令<font color="blue">kubectl top pod --all-namespaces</font>能夠看到Jenkins所佔內存僅有410兆,以下圖:

在這裏插入圖片描述

  1. Jenkins是Java應用,在處理大量任務的時候,410兆的內存應該是不夠的,JVM內存不足會致使頻繁的垃圾回收,接下來順着這個思路去看JVM內存狀況;
  2. 由上圖可知pod名爲<font color="blue">my-jenkins-74bcdfc566-lmhnw</font>,經過<font color="blue">kubectl describe pod my-jenkins-74bcdfc566-lmhnw -n helm-jenkins</font>查看此pod詳情:

在這裏插入圖片描述

  1. 由上圖紅框1可知此pod運行在node3節點,紅框2顯示對應的docker容器ID爲f9ae211abe99(前12位);
  2. 去node3機器上執行docker ps,果真發現了ID爲f9ae211abe99的容器,以下圖:

在這裏插入圖片描述

  1. 執行命令docker exec f9ae211abe99 jps查看容器內全部java進程的PID,以下圖,可見Jenkins服務在容器內的PID等於6:

在這裏插入圖片描述

  1. 知道了容器ID和java進程的PID,就能夠查看JVM信息了,執行命令docker exec f9ae211abe99 jstat -gcutil 6 3s 99查看GC狀況,以下圖,除了YGC頻繁,還出現了FGC:

在這裏插入圖片描述

  1. 再用命令docker exec f9ae211abe99 jmap -heap 6查看JVM內存狀況,以下圖,年輕代過小了,只有100兆:

在這裏插入圖片描述

  1. 最後用命令docker exec f9ae211abe99 ps -ef | grep java查看該進程的啓動命令,以下圖,可見啓動該java進程時並有指定內存參數:

在這裏插入圖片描述

  1. 在觀察內存參數的過程當中,ID爲f9ae211abe99的容器忽然不見了,取而代之的是一個ID爲7f1f94d79e46新容器,以下圖所示:

在這裏插入圖片描述11. 執行命令kubectl get event -n helm-jenkins查看該命名空間的全部事件,以下圖紅框所示,發現原來是探針不響應迫使K8S重啓該pod:
在這裏插入圖片描述
對當前系統的診斷已經完成,根據前面的信息能夠推測:JVM內存過小,YGC頻繁,甚至會有FGC出現,系統響應過慢還可能致使K8S探針判斷容器不健康,引起docker容器被刪除後從新建立,接下來就調整JVM參數,驗證推測是否正確;github

調整參數

  1. 宿主機節點有16G物理內存,沒有其餘業務,所以打算劃分8G內存給Jenkins;
  2. 執行命令kubectl edit deployment my-jenkins -n helm-jenkins,編輯jenkins的deployment,找到JAVA_OPTS參數的位置,在下面增長value,以下圖紅框所示:

在這裏插入圖片描述

  1. 找到docker容器ID後,執行命令docker exec 591dc47d4d57 jmap -heap 6查看JVM內存,以下圖所示,堆上限已經達到8G,年輕代是3686兆(調整前只有106兆)

在這裏插入圖片描述

  1. 併發執行任務一段時間後,觀察GC狀況發現並不頻繁:

在這裏插入圖片描述

  1. 再來看看該進程的啓動命令,執行命令docker exec 591dc47d4d57 ps -ef|grep java,以下圖紅框所示 ,剛纔設置的內存參數已經被用在啓動命令中了:

在這裏插入圖片描述

  1. 運行一段時間,確認任務可正常執行,頁面操做也比較流暢,查看K8S事件,再也沒有出現pod重啓的事件;

關於修改參數的方法

除了kubectl edit命令,還能夠將helm的Jenkins配置信息所有下載到本地,修改配置後再部署Jenkins服務,若是您想了解更多,請參考《》docker

至此,K8S環境下Jenkins性能問題處理已經完成,但願能給您帶來一些參考;
https://github.com/zq2599/blog_demos併發

相關文章
相關標籤/搜索