read/write计数在Java飞行记录中究竟代表什么?

What exactly does read/write count represent in Java Fligh Record?

所以,我的高层情况是调查 SNAT 端口耗尽的来源。由于我们的日志中没有任何问题的迹象,我们使用 JFR 分析设法找到的唯一线索是这个读取计数(来自 JDK Mission Control 的屏幕截图)。这是在大约 20 分钟的时间内记录的。

根据我们的日志,我们只执行了大约 70 个 HTTP 请求; Azure 中的 SNAT 连接计数指标在同一时期显示每分钟约 1,4k。

我如何在 JFR 中解释这个计数?就 TCP 而言,它到底代表什么? 我找不到任何好的解释。

我们正在使用 Jersey HTTP 客户端,ApacheConnector 和 PoolingHttpClientConnectionManagerBuilder 每个路由最多 10 个连接。

计数是发出的事件数,即套接字读取或套接字写入。默认情况下,仅发出超过 20 毫秒的事件。您可以将阈值设置为 0 毫秒以获取所有事件,但请注意开销可能很大并且文件可能会变得很大。

您可以通过两种方式更改设置:

1.使用 JMC

在录制向导中设置 I/O 阈值,或使用 Window -> 模板管理器创建自定义 .jfc 并在命令行启动它:

$ java -XX:StartFlightRecording:settings=my.jfc ...

$ jcmd <pid> JFR.start settings=my.jfc ...

2。手动编辑 .jfc 文件。

如果您不使用 JMC 开始录制,请将 JAVA_HOME/lib/jfr 中的 default.jfc 文件复制到 custom.jfc 文件并将 [=51] 的阈值设置为 0 毫秒=] 和 jdk.SocketWrite 事件。

<event name="jdk.SocketRead">
  <setting name="enabled">true</setting>
  <setting name="stackTrace">true</setting>
  <setting name="threshold" control="socket-threshold">0 ms</setting>
</event>

<event name="jdk.SocketWrite">
  <setting name="enabled">true</setting>
  <setting name="stackTrace">true</setting>
  <setting name="threshold" control="socket-threshold">0 ms</setting>
</event>

JDK 17

如果您使用的是 JDK 17 或更高版本,您还可以使用 JAVA_HOME/bin/jfr 工具。

$ jfr configure --interactive

按 Enter 直到向导询问套接字 I/O 阈值,键入 0 ms 并按 Enter 直到写入 custom.jfc 文件。然后像这样使用它:

$ java -XX:StartFlightRecording:settings=custom.jfc ..

或直接在命令行指定I/O阈值:

$ java -XX:StartFlightRecording:socket-threshold=0ms ...

$ jcmd <pid> JFR.start socket-threshold=0m