2016-04-23 7 views
2

私は現在パフォーマンス狩り中です。スループットを測定し、回帰しないようにするために、私はすばらしいJMHを使用しています。外部プロファイラの下でJMHベンチマークを実行することはできますか?

私も遅いです何かに遭遇したとき、私は何が起こっているかを見るために、プロファイリングを開始したい、this linkに応じJMHの著者は書いている:

JMHプロファイラは、分析に援助を提供することができるが、私は彼らが が適切なプロファイリングの代わりであるとは思わない。例えば。 "スタック"プロファイラは、プロファイルを見渡すのには良いですが、深刻な作業ではありません。 です。

実行時間が長い場合は、実行中のVM にプロファイラを接続してください。

私はひそかにコマンドラインからJMHテストを調整して、それにvisualvmのようなものをつけることを望んでいました...しかし、これまでのところ私はそれを動作させることができました。それは悪い考えだと思いますか?プロファイルに使用するコードと私が強制するコードを共有できるのが理想的です。

+0

スタックプロファイラはあまり良くありませんが、perf(またはperfasm)プロファイラは、ホットスポットがどこにあるかを見つけるのにはるかに優れています。マイクロベンチマークでは、コードの小さな部分の影響を見ることになりますが、いずれの場合でもperf/asmプロファイラはスキッドの対象となります(CPUは実際のホットスポットからのタイミング)。 perfm/asmはLinuxのみで有効です。 – AlBlue

答えて

1

これは悪い考えではありません。実際の接続方法は、外部プロファイラがサポートするものによって異なります。

  • プロファイラは、プロファイリングの下で​​Javaプロセスを起動することができる場合(例えば、のような のSolaris Studioパフォーマンスアナライザのcollect)、その後、 my-awesome-profiler java -jar benchmarks.jarはあなたの途中 そこになるだろう実行します。ただし、JMHは、ワークロードが実行される新しいプロセスを作成します( )。プロファイラが子プロセス をキャッチできることを確認してください。

  • プロファイラが実行中のプロセスに接続している場合、子プロセスを見つけてそれにアタッチします。プロセスには、...ForkedMainのような名前が付けられます。 VisualVMは実行中のJVMリストにリストすることができ、問題なくアタッチすることができます。 jpsには、他のプロファイラーにアタッチするPIDを割り当てることができます。警告は、実行時間を長くすることです。そのため、接続する時間が長くなります。それを行うために反復時間/カウントを増やしてください。

組み込みJMHプロファイラは、いつ接続するかを正確に知っている方法(プラス、無視するウォームアップデータ)に優れています。

1

はい、可能ですが、それは簡単ですが、私はそれを常にベストプラクティスとしてお勧めします!問題を再現するために余分な時間を費やす必要なく、何が起こっているのかを説明するためにデータを入手することは、常に良いことです。

私は自分のJMHプロファイラにJFR(Java Flight Recorder)を使用するように書いています:JmhFlightRecorderProfilerこれはJMHプロファイリングを開始し、ベンチマークが終了するとファイルにデータを保存します。このファイルは、JDKに同梱のJava Missionコントロールで開くことができます。ここで

は(complete example)あなたのベンチマークを開始し、それを使用することができる方法です。

Options opt = new OptionsBuilder() 
     .include(".*") 
     .addProfiler(JmhFlightRecorderProfiler.class) 
     .jvmArgs("-Xmx256m", "-Xms256m", "-XX:+UnlockCommercialFeatures", 
       "-Djmh.stack.profiles=" + destinationFolder, 
       "-Djmh.executor=FJP", 
       "-Djmh.fr.options=defaultrecording=true,settings=" + profile) 
     .result(destinationFolder + "/" + "benchmarkResults.csv") 
     .resultFormat(ResultFormatType.CSV) 
     .warmupIterations(10) 
     .measurementIterations(10) 
     .forks(1) 
     .build(); 
new Runner(opt).run(); 

私は、標準のビルド中にベンチマークを実行し、任意の劣化がある場合、私は監視するために/トレンドベンチマーク結果を/構築Jenkins JMH pluginを使用し、私は潜在的な原因を調べるためにBenchmark profilesを入手しました。

+0

ウォームアップの繰り返しでフライトレコーダーを実行しない方法はありますか? – Aliaxander

関連する問題