【问题标题】:AbstractNioSelector Unexpected exception in the selector loopAbstractNioSelector 选择器循环中的意外异常
【发布时间】:2017-10-18 10:50:19
【问题描述】:

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

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

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 中看到了类似的问题,但我没有手动控制服务器套接字。

【问题讨论】:

    标签: memory-leaks playframework websocket netty


    【解决方案1】:

    这看起来像一个 Java 错误。请在 openjdk 问题跟踪器上打开一个问题并包含堆栈跟踪..

    【讨论】:

    • 我使用的是 Oracle JDK,但同样的情况也发生在 Open JDK 上。他们是否共享相同的问题跟踪器?
    【解决方案2】:
    1. 我填写了问题,Oracle 回复说此类异常可能已在 JDK9 中修复(在 JDK-8168500 中)。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • uname -a: Linux api1 4.4.0-1013-aws #22-Ubuntu SMP Fri Mar 31 15:41:31 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
      • 而且,是的,我们在应用程序启动后授予了增加的文件描述符限制。这可能是一个原因吗?
      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多