如何在 Java Flight Recorder 采样中包含 IO 绑定方法?

Posted

技术标签:

【中文标题】如何在 Java Flight Recorder 采样中包含 IO 绑定方法?【英文标题】:How to include IO-bound methods in Java Flight Recorder sampling? 【发布时间】:2019-04-28 19:56:29 【问题描述】:

我在启动时通过为被测 Java 程序指定以下 CLI 选项来启动 JFR:

-Xmx24g -XX:+UnlockCommercialFeatures -XX:+FlightRecorder 
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,settings=profile

测试执行需要 90 秒才能完成。

在 Java Mission Control 中打开 JFR 转储后,JMC 中的 Call Tree 选项卡如下所示:

每秒少于 1 个样本。这使得细节钻取、热门方法和概述选项卡实际上毫无用处。 经过初步调查,确定方法采样设置为默认值 10 毫秒,事实证明,这个意外结果是因为在执行各种操作时,大约 98% 的 90 秒用于等待套接字 I/O不同的数据库读取,所以我只在另外 2% 的时间里获取方法样本。

我如何在方法时间中包含 I/O 绑定样本,以帮助找到花费最多时间等待数据库结果的跟踪?该过程包含多个地方的数据库查询,这些查询又从多个其他地方调用,因此猜测缓慢的调用路径并不容易。

【问题讨论】:

在非安全点启用采样有什么不同吗? @Lesiak 我取得了一些进展,不得不重新编写问题,我相信此时您的建议不适用。 【参考方案1】:

JDK 8 上的最低方法执行采样率为 10 毫秒,这是通过配置文件设置获得的。假设应用程序有负载,这对于 90 秒的录制应该绰绰有余。 JDK 11 中有一个错误导致示例太少,但我可以从屏幕截图中看到您正在运行早期版本。

如果您想知道应用程序在等待时正在做什么,您应该查看延迟选项卡(不是热方法)或套接字读取/套接字写入选项卡。有 Socket Read、Socket Write、Monitor Blocked、Monitor Wait 等事件,但如果您使用异步 I/O,则可能不适用。

编辑

【讨论】:

Latency Tab (Socked Read) 告诉我应用程序在做什么,而不是告诉我它在“哪里”做它 您可以查看堆栈跟踪以了解它的来源。 哈!我刚刚意识到 Socket Read 下的那行是可点击的 好!图形用户界面发生了变化。 Socket Read/Write 位于 Latency 选项卡中,但在 5.x 中移至 Socket Read 和 Socket Write 选项卡。

以上是关于如何在 Java Flight Recorder 采样中包含 IO 绑定方法?的主要内容,如果未能解决你的问题,请参考以下文章

jdk11新特性——Java Flight Recorder

jdk11新特性——Java Flight Recorder

内置 JFR(Java Flight Recorder)事件记录在哪里?

JMC Java Flight Recorder 未启用

Java Flight Recorder - 查找文件描述符泄漏

Java Flight Recorder - Live Objects 选项卡为空