Java Flight Recorder - 异步 I/O 支持

3

JFR是否支持异步I/O?

我正在使用Java Flight Recorder(在HotSpot 1.8.0_144上)+Mission Control来对一个应用程序进行分析。

在Mission Control的File IO选项卡中,我看到比我预期的和实际发生的"活动"要少几个数量级。
我真正看到的I/O "活动"似乎对应于同步文件I/O,但我不确定这是偶然还是我在JFR方面配置有误。

我尝试在一个更小的示例上运行,但似乎文件异步事件并没有被报告。

同步文件I/O事件已被报告

val inputStream = new FileInputStream("/home/cmhteixeira/Desktop/output.txt")
val outputStream = new FileOutputStream("/home/cmhteixeira/Desktop/output-copy.txt")

inputStream.transferTo(outputStream)

异步文件IO事件未被报告

RxIo(以下使用)是一个声称使用文件异步IO的库。

import org.javaync.io.AsyncFiles
import java.nio.file.Paths

val inputStream = Paths.get("/home/cmhteixeira/Desktop/output.txt")
val outputStream = Paths.get("/home/cmhteixeira/Desktop/output-copy.txt")

AsyncFiles
  .readAllBytes(inputStream)
  .thenCompose(bytes => AsyncFiles.writeBytes(outputStream, bytes))
  .thenAcceptAsync(index => println("done")/* invoked on completion */)

在上述两种情况下,当通过Java Mission Control启动时,文件IO阈值设置为0ns

问题

  • 不支持文件异步IO吗?
  • 异步套接字IO呢(我没有测试过)?
  • 如果答案是否定的,那么社区对使用JFR的影响有多大?
    • 感觉这是一个很大的缺点,但我缺乏了解背景,无法确定实际影响有多大。
1个回答

5

文件异步IO不支持吗?

没有文件异步IO的事件。

那么异步socket IO呢(我没有测试过)?

也不支持socket。

如果答案是否定的,社区对使用JFR的人会有多大影响?感觉这是一个很大的缺点,但我缺乏了解实际情况的背景。

这是一个已知问题,多年来一直很棘手难以解决。但JFR支持虚拟线程, 希望能减少直接使用异步API的需要。目前仍是一个预览功能(2022年4月)

请看FOSDEM的演示,33:00分钟处。 https://archive.fosdem.org/2020/schedule/event/state_openjdk/


谢谢!跟进问题:在Java中,据我所知,有非阻塞IO和异步IO。前者与SelectableChannelSelector相关,后者与AsynchronousSocketChannelAsynchronousFileChannel等相关。那么我假设JFR将不能捕获这两种事件之一? - cmhteixeira
1
正确,没有一个。 - Kire Haglin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接