在分析本土网络应用程序时,我遇到了非常奇怪的(至少对我而言)观察。
几乎所有时间都花在类的socketRead0()
方法上SocketInputStream
。这并不奇怪,因为我的应用程序对每个请求都使用远程服务进行联网。奇怪的是,这种方法不仅挂钟时间使用率很高,而且CPU 时钟时间也非常高。我不明白为什么 CPU 时间很高,因为如果我的应用程序等待远程服务回复(实际上并没有那么快),那么应用程序本身就没有什么可做的了。所以 CPU 时间应该很短。
更多观察:
- 采样模式下的 VisualVM 显示该方法
SocketInputStream.socketRead0()
占用了高达 95% 的时间(挂钟时间和CPU 时间); mpstat
(我们使用 Linux 作为操作系统)显示约 90% 的用户时间和约 1-3% 的系统时间(其余为空闲时间);- 部署在专用服务器上的应用程序;
- 远程服务也是 HTTP Web 应用程序。平均响应时间约为 100 毫秒。平均响应大小约为 2Kb。
- 我的应用程序使用 spring
RestTemplate
与远程服务进行交互,而不是SocketInputStream
直接。
现在我只有一个想法——也许这是在 JVM 中调用本机方法的开销(SocketInputStream.socketRead0()
是本机的)?
你怎么看?这还有其他原因吗?