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