weblogic.socket.Muxer使用100%的cpu

时间:2015-02-22 20:17:40

标签: java multithreading oracle weblogic weblogic12c

我们最近开始使用weblogic.Deployer实用程序在Weblogic 12c中进行部署。我们可以很好地部署EAR,但每当我们尝试取消部署该应用程序并且Managed Server仍在运行时,它将开始使用我们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)

我似乎有很多人遇到同样的问题(不过使用Weblogic):

https://github.com/netty/netty/issues/327

https://issues.jboss.org/browse/XNIO-172

Why does select() consume so much CPU time in my program?

我认为这不会发生,因为旧的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)
我用Google搜索了一下,但没有找到任何相关信息。你们WL专家知道这个问题可能是什么原因吗?

非常感谢!

3 个答案:

答案 0 :(得分:4)

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

<强> 1。使用posix muxer:

set('MuxerClass', 'weblogic.socket.PosixSocketMuxer')

请参阅Weblogic tunning

<强> 2。添加启动参数:

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider -DUseSunHttpHandler=true
  • sun.nio.ch.PollSelectorProvider 使用linux 民意调查代替 epoll_wait

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

答案 1 :(得分:3)

经过多次修补,几乎不眠不眠的夜晚,谷歌搜索直到我流血,我几乎可以肯定我已经解决了。

此解决方案主要基于另一个主题:https://stackoverflow.com/a/7827952/1484232

总结整个shebang,GC线程冲突(最有可能)导致了这里的问题。在将一些参数应用到我的VM后,它被神奇地解决了。

-XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC 
-XX:ParallelCMSThreads=2 
-XX:+CMSParallelRemarkEnabled 
-XX:+CMSIncrementalMode 
-XX:+CMSIncrementalPacing 
-XX:CMSFullGCsBeforeCompaction=1 
-XX:+CMSClassUnloadingEnabled 
-XX:CMSInitiatingOccupancyFraction=80

如果有人遇到同样的问题,这可以用来尝试让事情再次发挥作用。

干杯。

答案 2 :(得分:1)

这是Weblogic 12c的已知问题,并作为以下Oracle支持文档发布:

由于WLS 12.1.2+中的weblogic.socket.NIOSocketMuxer使用导致的性能问题(文档ID 2128032.1)(link

提供的解决方法是切换到使用Native Muxer类,如Omar MEBARKI的回答中所述。

本文未涉及此处其他答案中提及的任何或其他变通方法。