weblogic.socket.Muxer使用100%cpu

Gus*_*mos 5 java oracle multithreading weblogic weblogic12c

我们最近开始使用该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 VM (build 24.65-b04, mixed mode)
Run Code Online (Sandbox Code Playgroud)

我在Google上搜索了一下,但没有找到任何东西。您WL专家是否知道可能是此问题的原因?

非常感谢!

Oma*_*RKI 5

我遇到了同样的问题。我设法通过使用以下设置解决了该问题:

1.使用posix混合器:

set('MuxerClass', 'weblogic.socket.PosixSocketMuxer')
Run Code Online (Sandbox Code Playgroud)

请参阅Weblogic调教

2.添加启动参数:

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider -DUseSunHttpHandler=true
Run Code Online (Sandbox Code Playgroud)
  • sun.nio.ch.PollSelectorProvider使用linux poll而不是epoll_wait

  • -DUseSunHttpHandler = true绕过使用weblogic http套接字实现


Gus*_*mos 3

经过一番修修补补、几乎不眠之夜和谷歌搜索直到我流血之后,我几乎确信我已经解决了这个问题。

该解决方案很大程度上基于另一个线程:https ://stackoverflow.com/a/7827952/1484232

总结一下整个过程,GC 线程冲突(最有可能)导致了这里的问题。在对我的虚拟机应用一些参数后,它神奇地解决了。

-XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC 
-XX:ParallelCMSThreads=2 
-XX:+CMSParallelRemarkEnabled 
-XX:+CMSIncrementalMode 
-XX:+CMSIncrementalPacing 
-XX:CMSFullGCsBeforeCompaction=1 
-XX:+CMSClassUnloadingEnabled 
-XX:CMSInitiatingOccupancyFraction=80
Run Code Online (Sandbox Code Playgroud)

如果有人遇到同样的问题,可以尝试让事情再次正常运行。

干杯。