[SonarQube]Scanners(MSBuild)執行掃描時出現記憶體不足SonarQube java.lang.OutOfMemoryError: GC overhead limit exceeded

最近在新的專案CI流程內開始加入聲納(SonarQube)來進行程式碼分析,希望能獲得海面下更多有關程式碼品質度量的指標。從Jenkins以Command Line執行大型程式庫掃描時,卻出現了記憶體不足的異常,不過小型程式庫則可以正常完成掃描。

進入疑難排解階段,我們先確認伺服器記憶體是充足無虞的,不過觀察掃描程式在大型程式庫執行時,只吃到1G多一點就出現記憶體不足的異常。筆記解題方法。

 


案例現場採證

案發地點在Step 3-4,CI Server(Jenkins)執行掃描時: 

圖片來源: https://docs.sonarqube.org

 

現場採證:  "CHECKPOINT_WRITER"  java.lang.OutOfMemoryError: GC overhead limit exceeded

 

在現場也採證到案發前,啟動Post-processing時的證物,由於沒有設定SONAR_SCANNER_OPTS,預設值-Xmx1024m

還原現場,執行掃描時

 

執行第二次的錯誤訊息也是記憶體不足,但發生的thead變成在CLEANUP_MANAGER

 

 


解決方法

在執行程式碼分析前,如下的指令碼,設定變數SONAR_SCANNER_OPTS=-Xmx8192m

set SCA="C:\COCA\sonarQube\sonar-scanner-msbuild-4.3.1.1372-net46\SonarQube.Scanner.MSBuild.exe"
set MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe"
set SONAR_SCANNER_OPTS=-Xmx8192m
CD C:\RD\PayGateWayWeb
%SCA% begin /k:"org.sonarqube:sonarqube-scanner-msbuild" /n:"PayGateWayWeb" /v:"1.0"
%MSBUILD% /t:Rebuild
%SCA% end

 

Post-processing 啟動後,成功載入最大記憶體8GB的限制

記憶體吃超過1GB,突破盲腸了

 

SonarQube Scanner 成功完成掃描,分析結果成功發佈到SQ(SonarQube) Server。

 

打開SQ網站,技術債43天,還有許多的Code Smells。

 


技術債的天數計算

The value of the cost to develop a line of code is 0.06 days.

文件上說明修改一行技術債的程式碼大約要30分鐘,不過實際跑出來的有5分鐘、10分鐘,幸好他沒有算利息。

 


小結

  • 專案先從Blocker、Critical等級開始還債,歡迎加入還債人生Part2
  • 別忘了SQ Server也要放大Web (including embedded web server)、Compute Engine及ElasticSearch的記憶體上限。

 

在sonar.properties檔案加入以下設定:

sonar.web.javaOpts =-Xmx8192m -Xms512m -XX:MaxPermSize=8192m
sonar.ce.javaOpts =-Xmx8192m -Xms512m -XX:MaxPermSize=8192m
sonar.search.javaOpts =-Xmx8912m -Xms512m -XX:MaxPermSize=8192m

 

SQ Server內部架構

 

2018.02 舊金山 Cable car路線

 


參考

SONAR Architecture and Integration

SONAR Install the SonarScanner for MSBuild

SONAR Metric Definitions