最近在新的專案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