在剖析本土网络应用程序时,我遇到了非常奇怪的(至少对我来说)观察.
几乎所有的时间都花在socketRead0()了SocketInputStream课堂的方法上.这并不奇怪,因为我的应用程序在每个请求上都使用远程服务进行联网.奇怪的是,这种方法不仅挂钟时间使用率高,而且CPU时钟时间也很高.我无法理解为什么CPU时间很长,因为如果我的应用程序等待远程服务回复(实际上并不是那么快),那么应用程序本身就没有什么可做的了.所以CPU时间应该很低.
更多观察:
SocketInputStream.socketRead0()占用时间高达95%(挂钟时间和 CPU时间);mpstat (我们使用Linux作为操作系统)显示约90%的用户时间和约1-3%的系统时间(其余为空闲时间);RestTemplate来与远程服务进行交互,而不是SocketInputStream直接进行.现在我只有一个想法 - 也许这是在JVM中调用本机方法的开销(SocketInputStream.socketRead0()原生)?
你怎么看?还有其他原因吗?
我使用了很多客户端向服务器发送一个请求,每秒大约有1000个客户端请求,服务器的CPU很快升到600%(8个核心),并始终保持这种状态.当我使用jstack打印处理内容时,我发现SelectorImpl处于BLOCKED状态.记录如下:
nioEventLoopGroup-4-1 prio=10 tid=0x00007fef28001800 nid=0x1dbf waiting for monitor entry [0x00007fef9eec7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at sun.nio.ch.EPollSelectorImpl.doSelect(Unknown Source)
- waiting to lock <0x00000000c01f1af8> (a java.lang.Object)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(Unknown Source)
- locked <0x00000000c01d9420> (a io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x00000000c01f1948> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000000c01d92c0> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(Unknown Source)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:635)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:319)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
高CPU与此有关吗?另一个问题是,当我连接很多客户端时,发现一些客户端会连接,错误如下:
"nioEventLoopGroup-4-1" prio=10 tid=0x00007fef28001800 nid=0x1dbf waiting for monitor entry [0x00007fef9eec7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at sun.nio.ch.EPollSelectorImpl.doSelect(Unknown Source)
- waiting to lock <0x00000000c01f1af8> (a java.lang.Object) …Run Code Online (Sandbox Code Playgroud) 我们最近开始使用该weblogic.Deployer实用程序体验Weblogic 12c中的部署。我们可以部署EAR,但是只要在托管服务器仍在运行的情况下尝试取消部署该应用程序,它将开始使用100%的CPU(4核Xeon,裸机)。
经过一些修补和无数次线程转储之后,我们可以将问题隔离在4个卡住的线程上。他们每个人在一个核心上消耗了100%。平均负载将在5分钟内从约0.10跳到4.00。
这是似乎被卡住的线程:
"ExecuteThread: '3' for queue: 'weblogic.socket.Muxer'" daemon prio=10 tid=0x00007fb52801c800 nid=0x6bf0 runnable [0x00007fb58a0ad000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <0x00000000e18c66d0> (a sun.nio.ch.Util$2)
- locked <0x00000000e18c66c0> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000000e18c6598> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:102)
at weblogic.socket.NIOSocketMuxer.selectFrom(NIOSocketMuxer.java:541)
at weblogic.socket.NIOSocketMuxer.processSockets(NIOSocketMuxer.java:470)
at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:30)
at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:43)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:147)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:119)
Run Code Online (Sandbox Code Playgroud)
我似乎有很多人遇到相同的问题(不过,不是Weblogic的):
https://github.com/netty/netty/issues/327
https://issues.jboss.org/browse/XNIO-172
我认为这可能不会发生,因为旧的JDK版本。java -version说:
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server …Run Code Online (Sandbox Code Playgroud) 我对wowza中的cpu使用有疑问。
这是令人怀疑的线程。此线程占用了较高的CPU。
SocketAcceptorIoProcessor-1.0 prio=10 tid=0x0000002a9fb53000 nid=0x2428 runnable [0x000000004f017000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
- locked <0x00000007d82ba4e8> (a sun.nio.ch.Util$2)
- locked <0x00000007d82ba4d8> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000007d82ad450> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(Unknown Source)
at org.apache.mina.util.NamePreservingRunnable.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
此线程占用了很高的CPU。这是jdk错误吗?
这是我的环境。
CentOS版本5.4(最终版)
WowzaMediaServer-3.1.2
Java版本1.6.0_23 Java SE运行时环境(内部版本1.6.0_23-b05)Java HotSpotTM 64位服务器VM(内部版本19.0-b09,混合模式)