我们正在更改群集拓扑,并在“默认I / O-x”线程(org.xnio.nio.WorkerThread)中面临100%CPU问题。
看起来像ConduitStreamSinkChannel.write(..)中的无限循环,但我不确定。
问题是间歇性的,并且不容易重现,需要重新启动才能停止。
每次进入此状态时,线程转储都是相同的:
"default I/O-2" #103 prio=5 os_prio=0 tid=0x00007fd0f83a4800 nid=0x6941 runnable [0x00007fd0e9be0000]
java.lang.Thread.State: RUNNABLE
at java.lang.Throwable.fillInStackTrace(Native Method)
at java.lang.Throwable.fillInStackTrace(Throwable.java:783)
- locked <0x00000007a2be6ec0> (a java.nio.channels.ClosedChannelException)
at java.lang.Throwable.(Throwable.java:250)
at java.lang.Exception.(Exception.java:54)
at java.io.IOException.(IOException.java:47)
at java.nio.channels.ClosedChannelException.(ClosedChannelException.java:52)
at org.xnio.ssl.JsseStreamConduit.write(JsseStreamConduit.java:1022)
at org.xnio.conduits.ConduitStreamSinkChannel.write(ConduitStreamSinkChannel.java:150)
at org.xnio.http.HttpUpgrade$HttpUpgradeState$StringWriteListener.handleEvent(HttpUpgrade.java:385)
at org.xnio.http.HttpUpgrade$HttpUpgradeState$StringWriteListener.handleEvent(HttpUpgrade.java:372)
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.xnio.conduits.WriteReadyHandler$ChannelListenerHandler.writeReady(WriteReadyHandler.java:65)
at org.xnio.ssl.JsseStreamConduit.run(JsseStreamConduit.java:393)
at org.xnio.ssl.JsseStreamConduit.writeReady(JsseStreamConduit.java:524)
at org.xnio.ssl.JsseStreamConduit$1.writeReady(JsseStreamConduit.java:287)
at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:94)
at org.xnio.nio.WorkerThread.run(WorkerThread.java:567)
拓扑中的更改将添加更多服务器组并更改反向代理(nginx),以便将每个http连接重定向(状态301)到https。
分析线程转储,似乎与https(软件包org.xnio.ssl。*)有关,但是nginx后面的所有内容都是纯http。
我们的应用程序提供了一个Websocket端点(通过nginx通过WSS),并且对其他服务器(http远程处理,而无需通过nginx地直接对其他服务器)进行了很多EJB远程调用。
此外,应用程序通过负载平衡器(nginx https,以避免301重定向)向集群中的其他服务器发出/接收一些REST调用(RESTEasy)
可能是什么原因造成的?
谢谢!