2016-04-23 60 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

相关问题