VisualVM 套接字.read

问题描述 投票:0回答:3

所以我使用 VisualVM 分析我的应用程序。

我遇到了有关 MySQL 交互的热点。我的第一个想法是热点显示了我的应用程序在 IO 之后等待的时间。但在分析报告中,VisualVM 有两列“Time”和“Time (cpu)”。也许这个术语被错误地使用了,但我假设 self-time (cpu) 列不包括 IO 时间。经过更多调试后,我们得出结论,假设是错误的,并且显示了 IO 时间,因为热点位于 MySQL 驱动程序的 java.net.SocketInputStream.read() 和其他不应该消耗任何 cpu 的 IO 事物上。

所以,我的问题是为什么 VisualVM 将 SocketInputStream.read() 报告为 CPU 时间?

Screnshot

java profiling visualvm
3个回答
11
投票

在监视线程活动时,本机调用始终处于 RUNNABLE 状态,可能是因为 JVM 无法知道本机调用是否正在休眠或实际上正在执行某些操作。 因此,处于 RUNNABLE 状态的时间算作 CPU 时间。


1
投票

这个很长的线程声称小写入可能会导致问题。值得一读,但我不知道你能做些什么。你能做什么?您可能会确保您没有使用较小的 fetch size。这不会给你带来小写入,但小读取会导致同样的问题。您可以为客户端或服务器尝试不同的平台。 这个 bug 中有一条评论,内容如下:

“我们已经看到了 Solaris 和 Linux 之间 I/O 缓冲区填充速度的巨大不同行为(以及对 ReadAheadInputStream.fill() 的调用次数,因为它读取可用内容,因此不会阻塞,除非它需要阅读比现有内容更多的内容)。”


-2
投票

© www.soinside.com 2019 - 2024. All rights reserved.