2016-04-23 55 views
2

我目前正在表演。爲了衡量吞吐量,並強制我們不倒退,我使用了美妙的JMH。是否可以在外部分析器下運行JMH基準測試?

當我遇到一些又慢,雖然,我要開始剖析,看看是怎麼回事,根據this link江鈴控股的作者寫道:

雖然江鈴控股廓線儀可以提供分析援助,我不認爲他們 是適當的分析的替代品。例如。 「堆棧」分析器是 很好的瀏覽配置文件,但不是認真的工作。

將工作負載運行更長時間,並將選擇的分析器附加到運行VM的 。

我暗暗希望能夠從命令行調整JMH測試,然後附加visualvm之類的東西......但到目前爲止,我已經能夠得到它的工作。我想這是一個壞主意?如果我可以共享我用於配置文件的代碼以及我用來執行的代碼,那將是理想的選擇。

+0

雖然堆棧分析器不是很好,但perf(或perfasm)分析器對於找出熱點位置要好得多。雖然在microbenchmarks中你會看到一小部分代碼的影響,並且在任何情況下,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

相關問題