weblogic.socket.Muxer使用100%的CPU

6
我们最近开始尝试使用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)

我看到很多人遇到了同样的问题(虽然不是关于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)

我在谷歌上搜索了一下,但没有找到任何相关信息。WL专家们知道这个问题的原因吗?

非常感谢!

3个回答

6

我遇到了相同的问题。 通过使用以下设置,我成功解决了它:

1. 使用posix多路复用器:

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

请参考Weblogic调优

2. 添加启动参数:

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider -DUseSunHttpHandler=true
  • sun.nio.ch.PollSelectorProvider 使用linux poll而不是epoll_wait

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


3

经过一番尝试,几乎失眠的夜晚和疯狂搜索,我几乎确定问题已经解决了。

这个解决方案主要基于另一个线程:https://dev59.com/i3E85IYBdhLWcg3wJQGt#7827952

总的来说,GC线程碰撞(很可能)导致了这里的问题。在对我的VM应用了一些参数之后,问题神奇地得到了解决。

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

如果其他人遇到了同样的问题,这个方法可以尝试一下,让事情重新正常运转。

祝好。


我遇到了同样的问题,但这些设置没有任何作用(我的感觉是,它们甚至让情况变得更糟)。 - NeplatnyUdaj
嗨@NeplatnyUdaj...情况似乎因案而异。在Weblogic 12c中,NIO实现似乎不太好。但我们在12.1.3版本上没有看到这些问题,所以尝试一下可能是个好主意。甚至可以尝试更新的12.1.4版本。祝好运。 - Gustavo Ramos
我已将JDK从1.7.0_25更改为1.8.0_60,目前一切正常。 - NeplatnyUdaj
@NeplatnyUdaj 太好了!我使用的是1.7.0_62版本。计划使用1.8,希望可以解决你的问题。 - Gustavo Ramos

1
这是Weblogic 12c已知的问题,发布在以下Oracle支持文档中:性能问题由于WLS 12.1.2+中weblogic.socket.NIOSocketMuxer的使用(文档ID 2128032.1)(link)。提供的解决方法是切换到使用原生多路复用器类,如Omar MEBARKI的答案所述。该文章未涉及其他答案中提到的任何解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接