相关疑难解决方法(0)

SocketInputStream.socketRead0()中CPU使用率高的原因

在剖析本土网络应用程序时,我遇到了非常奇怪的(至少对我来说)观察.

几乎所有的时间都花在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()原生)?

你怎么看?还有其他原因吗?

java linux performance jvm cpu-usage

17
推荐指数
1
解决办法
3655
查看次数

SelectorImpl是BLOCKED

我使用了很多客户端向服务器发送一个请求,每秒大约有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)

java blocked selector

7
推荐指数
1
解决办法
2773
查看次数

weblogic.socket.Muxer使用100%cpu

我们最近开始使用该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

为什么select()会在程序中消耗大量CPU时间?

我认为这可能不会发生,因为旧的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)

java oracle multithreading weblogic weblogic12c

5
推荐指数
2
解决办法
4830
查看次数

wowza java cpu使用率高

我对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,混合模式)

java cpu multithreading wowza mina

1
推荐指数
1
解决办法
2965
查看次数