是否可以在外部分析器下运行 JMH 基准测试?

Alu*_*lun 9 java visualvm yourkit performance-testing jmh

我目前正在寻找性能。为了衡量吞吐量,并确保我们不会倒退,我使用了很棒的 JMH。

当我遇到的东西是,虽然慢,我要开始剖析,看看是怎么回事,根据这个链接江铃控股的作者写道:

虽然 JMH 分析器可以帮助分析,但我认为它们不能替代正确的分析。例如,“堆栈”分析器很适合浏览配置文件,但不适用于严肃的工作。

更长时间地运行工作负载,并将您选择的分析器附加到正在运行的 VM。

我暗中希望我可以从命令行调整 JMH 测试,然后将诸如visualvm 之类的东西附加到它上面……但到目前为止我已经能够让它工作了。我想这是个坏主意?如果我可以共享我用来分析的代码以及我用来强制执行的代码,那将是理想的。

Ale*_*lev 5

这不是一个坏主意。实际的附加方式取决于外部分析器支持的内容。

  • 如果分析器可以在分析下启动 Java 进程(例如像 Solaris Studio Performance Analyzer 的collect),那么执行 my-awesome-profiler java -jar benchmarks.jar将使您成功。但是请注意,JMH 会分叉出运行工作负载的新进程。确保分析器能够捕获子进程。

  • 如果探查器附加到正在运行的进程,则找到一个子进程并附加到它。这个过程会有一个有说服力的名字,比如...ForkedMain. VisualVM 应该能够将它列在正在运行的 JVM 列表中,并且可以毫无问题地附加到它。您可以jps为其他分析器附加一个 PID。需要注意的是,要延长运行时间,以便您有更多时间进行附加。增加迭代时间/计数来做到这一点。

嵌入式 JMH 分析器的优势在于它们确切知道何时附加(另外,要忽略哪些预热数据)。


use*_*737 5

是的,这是可能的,它很容易做到,我建议将其作为始终执行的最佳实践!拥有可用数据来解释正在发生的事情总是好的,而无需花费额外的时间来重现问题。

我编写了自己的 JMH 分析器来使用 JFR(Java 飞行记录器):JmhFlightRecorderProfiler,它将在基准测试结束时启动 JMH 分析并将数据保存到文件中。您可以使用 JDK 附带的 Java Mission Control 打开此文件。

以下是如何启动基准测试并使用它(完整示例):

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();
Run Code Online (Sandbox Code Playgroud)

我在标准构建期间运行基准测试,我使用Jenkins JMH 插件来监控/趋势基准测试结果/构建,如果观察到任何降级,我有可用的基准配置文件来调查潜在原因。