Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SonarQube で /d:sonar.cfamily.threads を指定して SonarQube を高速化する #880

Closed
m-tmatma opened this issue Apr 29, 2019 · 10 comments · Fixed by #883
Closed

SonarQube で /d:sonar.cfamily.threads を指定して SonarQube を高速化する #880

m-tmatma opened this issue Apr 29, 2019 · 10 comments · Fixed by #883

Comments

@m-tmatma
Copy link
Member

要望機能

SonarQube で /d:sonar.cfamily.threads を指定して SonarQube を高速化する

@berryzplus さんのコメント

#674 (comment)

ローカルでうまくやる方法を見付けたのでとりあえず共有。

@rem to ensure hide variable SONAR_QUBE_TOKEN
@echo off
"%SonarScanner_MSBUILD%" begin                      ^
	/k:"%SONAR_QUBE_PROJECT%"                       ^
	/o:"%SONAR_QUBE_ORG%"                           ^
	/d:sonar.cfamily.build-wrapper-output=%~dp0bw-output ^
	/d:sonar.cfamily.threads=%NUMBER_OF_PROCESSORS%  ^
	/d:sonar.sourceEncoding=UTF-8                   ^
	/d:sonar.host.url="https://sonarcloud.io"       ^
	/d:sonar.login="%SONAR_QUBE_TOKEN%"

同時実行スレッド数 sonar.cfamily.threads がデフォルトでは 1 に設定されている。
ここに環境依存の値(=利用可能なコア数)を入れてやると解析速度が劇的に改善する。
1スレッドで1時間かかる作業も、4スレッドなら15分で終わる。

Azule Pipelines で %NUMBER_OF_PROCESSORS% がどれくらいかは分かりませんが、リアルに1コアってことはないと思うので、それなりな改善を見込めると思われます。

うちの環境で スレッド数=4 にして実行させて見たログです。

INFO: Analysis total time: 11:51.584 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 11:56.458s
INFO: Final Memory: 34M/1375M
INFO: ------------------------------------------------------------------------
The SonarQube Scanner has finished

利用可能なコア数が8とかだったら10分を切りそうな感じに効果てきめんなので、試してみる価値がありそうです。

@m-tmatma
Copy link
Member Author

Azule Pipelines で %NUMBER_OF_PROCESSORS% がどれくらいかは分かりませんが、リアルに1コアってことはないと思うので、それなりな改善を見込めると思われます。

https://dev.azure.com/sakuraeditor/sakura/_build/results?buildId=309
等で "Show environmental variables for debug" 等の step を見ると環境変数を確認できます。

118 行目あたりで NUMBER_OF_PROCESSORS=2 となっているのを確認できます。

@m-tmatma
Copy link
Member Author

NUMBER_OF_PROCESSORS が 16のマシンで実行したところ、メモリ不足で失敗した。

ERROR: Exception in thread pool-3-thread-3
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-14
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-4
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-11
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-10
java.lang.OutOfMemoryError: Java heap space
        at java.nio.file.Files.read(Unknown Source)
        at java.nio.file.Files.readAllBytes(Unknown Source)
        at com.sonar.cpp.analyzer.Subprocess.execute(Subprocess.java:58)
        at com.sonar.cpp.analyzer.Subprocess.execute(Subprocess.java:25)
        at com.sonar.cpp.plugin.CFamilySensor.lambda$process$4(CFamilySensor.java:323)
        at com.sonar.cpp.plugin.CFamilySensor$$Lambda$842/16628503.run(Unknown Source)
        at com.sonar.cpp.analyzer.AnalysisExecutor.lambda$submit$0(AnalysisExecutor.java:53)
        at com.sonar.cpp.analyzer.AnalysisExecutor$$Lambda$843/15405831.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

ERROR: Exception in thread pool-3-thread-9
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-16
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-6
java.lang.OutOfMemoryError: Java heap space
        at java.nio.file.Files.read(Unknown Source)
        at java.nio.file.Files.readAllBytes(Unknown Source)
        at com.sonar.cpp.analyzer.Subprocess.execute(Subprocess.java:58)
        at com.sonar.cpp.analyzer.Subprocess.execute(Subprocess.java:25)
        at com.sonar.cpp.plugin.CFamilySensor.lambda$process$4(CFamilySensor.java:323)
        at com.sonar.cpp.plugin.CFamilySensor$$Lambda$842/16628503.run(Unknown Source)
        at com.sonar.cpp.analyzer.AnalysisExecutor.lambda$submit$0(AnalysisExecutor.java:53)
        at com.sonar.cpp.analyzer.AnalysisExecutor$$Lambda$843/15405831.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

ERROR: Exception in thread pool-3-thread-5
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-8
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-7
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-13
java.lang.OutOfMemoryError: Java heap space

ERROR: Exception in thread pool-3-thread-15
java.lang.OutOfMemoryError: Java heap space

INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
INFO: Total time: 57.171s
INFO: Final Memory: 13M/247M
INFO: ------------------------------------------------------------------------
ERROR: Error during SonarQube Scanner execution
ERROR: java.lang.OutOfMemoryError: Java heap space
ERROR: Caused by: Java heap space
ERROR:
The SonarQube Scanner did not complete successfully
19:57:35.734  Post-processing failed. Exit code: 1
ERROR in C:\ProgramData\chocolatey\bin\SonarScanner.MSBuild.exe end errorlevel 1
ERROR build 1

@m-tmatma
Copy link
Member Author

NUMBER_OF_PROCESSORS が 16のマシンで実行したところ、メモリ不足で失敗した。

https://docs.sonarqube.org/display/SONARQUBE53/Analyzing+with+SonarQube+Scanner

SONAR_RUNNER_OPTS の環境変数でメモリを設定できるらしい。

@m-tmatma
Copy link
Member Author

@berryzplus
Copy link
Contributor

スレッド数=16の実績値は4分20秒でした。
メモリ消費量のところはMax6GBと出てた気がします。

マニュアルにこんな記述があります。

Grant more memory to the web server / compute engine / elastic search

To grant more memory to a server-side process, uncomment and edit the relevant javaOpts property in $SONARQUBE_HOME/conf/sonar.properties, specifically:
•sonar.web.javaOpts (minimum values: -server -Xmx768m)
•sonar.ce.javaOpts
•sonar.search.javaOpts

試してはいませんが sonar.ce.javaOpts にjavaの -Xmx を指定してあげたらいいような気はします。

@berryzplus
Copy link
Contributor

結果的に %NUMBER_OF_PROCESSORS% を指定するのはアブナイという結論?

@m-tmatma
Copy link
Member Author

32bit 版の java がインストールされてました。

sonar.ce.javaOpts を指定しなくてもいけました。

diff --git a/build-sonar-qube-start.bat b/build-sonar-qube-start.bat
index 722ad611..741e7bb5 100644
--- a/build-sonar-qube-start.bat
+++ b/build-sonar-qube-start.bat
@@ -24,6 +24,7 @@ if exist .sonarqube rmdir /s /q .sonarqube
        /k:"%SONAR_QUBE_PROJECT%"                       ^
        /o:"%SONAR_QUBE_ORG%"                           ^
        /d:sonar.cfamily.build-wrapper-output=%~dp0bw-output ^
+       /d:sonar.cfamily.threads=%NUMBER_OF_PROCESSORS% ^
        /d:sonar.sourceEncoding=UTF-8                   ^
        /d:sonar.host.url="https://sonarcloud.io"       ^
        /d:sonar.login="%SONAR_QUBE_TOKEN%"

INFO: Analysis total time: 3:13.322 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 3:16.783s
INFO: Final Memory: 33M/3885M
INFO: ------------------------------------------------------------------------
The SonarQube Scanner has finished

@berryzplus
Copy link
Contributor

おおっ!4分切ってる!・・・とか言うと高校生男子の1500m走のタイムみたいですがw

@m-tmatma
Copy link
Member Author

32bit 版の java がインストールされてました。

#882 でドキュメント修正しました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants