【问题标题】:Java Flight Recorder is not reporting any File I/O eventsJava Flight Recorder 未报告任何文件 I/O 事件
【发布时间】:2021-08-23 17:40:10
【问题描述】:

Java Flight Recorder 的一项宣传功能是能够在 JMC 8.1 的文件 I/O 选项卡中报告创建、读取或强制执行的文件

为了测试这个功能,我创建了一个小应用程序,它使用 Apache commons-io 将一个大文件从源复制到目标。

public static void fileCopy(String srcPath ,String destPath) throws IOException {
    File inpFile = new File(srcPath);
    if(inpFile.exists() && inpFile.isFile()) {
        File destFile = new File(destPath);
        FileUtils.copyFile(inpFile, destFile);
    }
}

在使用配置文件模板启动 FlightRecoder 并观察 jfr 文件时,我在文件 I/O 模板中看不到任何事件,即使复制操作花费了 11 秒。

使用的 JVM - Ubuntu 上的 OpenJDK 11。

 java -XX:StartFlightRecording=name=benchmark,filename=benchmark.jfr,settings=profile -jar filecopyer-0.0.1-SNAPSHOT.jar 

我在profile.jfc模板中将File IO阈值改成0ns后也重试了,还是没有记录任何事件。

只为 jdk.FileWrite 、 jdk.FileRead 和 jdk.FileForce 捕获了 0 个事件。

不过,我确实看到 jdk.NativeMethodSample 下的事件,commons-io 最终会调用它。

github 上的示例应用程序: Profiled application

我做错了什么?

【问题讨论】:

    标签: java jmc jfr


    【解决方案1】:

    看起来 Apache Commons 似乎使用的 Files.copy 的实现依赖异步 I/O 来进行复制。见 sun.nio.fs.UnixCopyFile::copy(...)

    JFR 当前不检测异步 I/O 操作。

    【讨论】:

    • 感谢您提供此信息。我正在寻找关于各种事件所代表的良好文档。我没有找到。是否有文档提到 JFR 目前不检测异步 I/O 操作,我可以参考。
    • “异步 I/O 事件在 JFR 中是一个中断,因为我们还没有弄清楚如何建模和实现它们。”bugs.openjdk.java.net/browse/JDK-8075813
    • 我将代码更改为使用 BufferedInputStream 和 FileInputStream 而不是 commons-io 并使用它来复制带有 readNBytes(b[],off,len) 和 writeNBytes 的大文件。然而,没有记录任何事件。你能指出我可以使用的 api 会导致 jdk.FileRead 和 Write 事件触发吗?此外,openjdk 错误链接位于密码墙后面。
    • FileInputStream 应该可以工作。您可以在此处查看示例:github.com/openjdk/jdk/blob/master/test/jdk/jdk/jfr/event/io/… 阈值可能需要设置为 0 ns。对不起,密码,但我找不到任何公开的地方,所以你必须相信我的话。我在 OpenJDK 从事 JFR 工作十年。
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多