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
所以,我的高层情况是调查 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