AbstractNioSelector选择器循环中出现意外异常

时间:2017-05-18 14:40:02

标签: memory-leaks playframework websocket netty

我在生产时使用Scala Play Framework 2.4.6和Netty 3.10.6.Final运行WebSocket服务器。 Oracle JDK 8。

通常,服务器工作正常,但在高负载时,它会触发异常并开始泄漏Linux袜子。

2017-05-16 15:18:28,149 WARN  o.j.n.c.s.n.AbstractNioSelector Unexpected exception in the selector loop.
java.lang.NullPointerException: null
    at sun.nio.ch.EPollArrayWrapper.isEventsHighKilled(EPollArrayWrapper.java:174) ~[na:1.8.0_131]
    at sun.nio.ch.EPollArrayWrapper.setUpdateEvents(EPollArrayWrapper.java:190) ~[na:1.8.0_131]
    at sun.nio.ch.EPollArrayWrapper.add(EPollArrayWrapper.java:239) ~[na:1.8.0_131]
    at sun.nio.ch.EPollSelectorImpl.implRegister(EPollSelectorImpl.java:178) ~[na:1.8.0_131]
    at sun.nio.ch.SelectorImpl.register(SelectorImpl.java:132) ~[na:1.8.0_131]
    at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:212) ~[na:1.8.0_131]
    at org.jboss.netty.channel.socket.nio.NioWorker$RegisterTask.run(NioWorker.java:151) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:391) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:315) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) [io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) [io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) [io.netty.netty-3.10.4.Final.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]

1800个用户连接到服务器时会出现问题。然后内存和Linux套接字增长。调试这个很难,我没有在Play Framework发行说明中解决任何套接字泄漏问题。

我在SO中看到了类似的问题,但我没有手动控制服务器套接字。

3 个答案:

答案 0 :(得分:1)

这看起来像是一个Java bug。请在openjdk问题跟踪器上打开一个问题,并包含stacktrace ..

答案 1 :(得分:0)

  1. 我填写了问题,Oracle回答说JDK9中已经修复了这样的异常(在JDK-8168500中)。

  2. 我们通过减少akka的线程数来解决这个问题。

答案 2 :(得分:0)

这可能是JDK-8168500,已在JDK 9中修复。你能说出内核版本在这里吗?当这个问题最初出现时,它只能通过动态更改文件描述符限制来重现。