【问题标题】:Is it possible to run a JMH benchmark under an external profiler?是否可以在外部分析器下运行 JMH 基准测试?
【发布时间】:2016-08-16 20:42:29
【问题描述】:

我目前正在寻找性能。为了衡量吞吐量,并确保我们不回归,我使用了出色的 JMH。

当我遇到一些缓慢的东西时,我想开始分析以查看发生了什么,根据this link JMH 的作者写道:

虽然 JMH 分析器可以帮助进行分析,但我认为它们不能 是正确分析的替代品。例如。 “堆栈”分析器是 很高兴浏览一下个人资料,但不适合认真的工作。

运行工作负载更长时间,并将您选择的分析器附加到 运行虚拟机。

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

【问题讨论】:

  • 虽然堆栈分析器不是很好,但 perf(或 perfasm)分析器对于找出热点的位置要好得多。尽管在微基准测试中您将看到一小部分代码的效果,并且在任何情况下,perf/asm 分析器都会出现问题(CPU 将报告计时可能是来自真实热点的一些指令)。请注意,perfm/asm 仅对 Linux 有效。

标签: java performance-testing visualvm jmh yourkit


【解决方案1】:

是的,它是可能的,它很简单,我推荐它作为一个最佳实践,一直这样做!有可用的数据来解释正在发生的事情总是好的,而无需花费额外的时间来重现问题。

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

您可以通过以下方式开始您的基准测试并使用它 (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 来调查潜在原因。

【讨论】:

  • 有没有办法在热身迭代时不运行飞行记录器?
  • @user2179737 链接(完整示例)已损坏
  • @robbie70 感谢您报告损坏的链接,已修复。
  • @Aliaxander 可能我没有对此进行调查,但是您可以使用stack sampling profiler 来获取按迭代分解的配置文件信息。 (see 了解如何帮助进行性能调查)
  • @Aliaxander 看看我刚刚写的一个新的 JMH 分析器集成at,它将保存单独的 jfr 配置文件用于预热和测量。使用方法见example,
【解决方案2】:

您可以通过添加“-agentpath”JVM 选项来运行 YourKit 分析代理。请在此处查看详细信息https://www.yourkit.com/docs/java/help/agent.jsp

【讨论】:

    【解决方案3】:

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

    • 如果分析器可以在分析下启动 Java 进程(例如,像 Solaris Studio 性能分析器的collect),然后执行 my-awesome-profiler java -jar benchmarks.jar 会让你半途而废 那里。但是请注意,JMH 分叉了新流程,其中 工作负载正在运行。确保分析器能够捕捉到孩子 进程。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多