冻土
本帖最后由 冻土 于 2018-11-10 23:49 编辑

之前发过一次这个问题了,但是没能够得到解决,所以再发一次。原来的问题因为发的时间太久,已经申请关闭了。

这个问题出现在装了forge的服务端,虽然确切地说是1.12.2/forge2705/sponge3361,但是推测这个问题在其他装了forge的端上面也会存在。

大家都知道,服务器或者客户端网络状况不好的时候容易出现进入游戏后无法移动,并随后卡掉线的情况。
但是在自己开服的过程中我发现了这样一个问题:
当一个玩家掉线时,有时候会出现如下面所示的15行报错:
  1. [01:45:19] [Netty Server IO #12/ERROR] [FML]: NetworkDispatcher exception
  2. java.io.IOException: 远程主机强迫关闭了一个现有的连接。
  3.         at sun.nio.ch.SocketDispatcher.writev0(Native Method) ~[?:1.8.0_171]
  4.         at sun.nio.ch.SocketDispatcher.writev(Unknown Source) ~[?:1.8.0_171]
  5.         at sun.nio.ch.IOUtil.write(Unknown Source) ~[?:1.8.0_171]
  6.         at sun.nio.ch.SocketChannelImpl.write(Unknown Source) ~[?:1.8.0_171]
  7.         at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:432) ~[NioSocketChannel.class:?]
  8.         at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856) [AbstractChannel$AbstractUnsafe.class:?]
  9.         at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.forceFlush(AbstractNioChannel.java:368) [AbstractNioChannel$AbstractNioUnsafe.class:?]
  10.         at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:618) [NioEventLoop.class:?]
  11.         at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:559) [NioEventLoop.class:?]
  12.         at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:476) [NioEventLoop.class:?]
  13.         at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438) [NioEventLoop.class:?]
  14.         at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [SingleThreadEventExecutor$5.class:?]
  15.         at java.lang.Thread.run(Unknown Source) [?:1.8.0_171]
复制代码
并且在掉线后的一段时间内重复出现多次。如果玩家多次尝试登录并掉线,这个报错的规模将会极为巨大,堪称史上最强复读机。
这个复读机有多强呢,如下图所示:

可以看到这个log文件的行数高达214.3万行,而其中“NetworkDispatcher exception”的计数高达14万多,而由于每出现一句“NetworkDispatcher exception”就意味着15行报错,推算可知其中报错高达2142510行,也就是说二百万行的log中只有五百行不是这个报错!
刷报错的时候,服务端后台输入指令会产生巨大延迟,同时服务端的性能也会有少许下降。

因为我不懂Java,只能瞎猜一下bug的原因。
我猜想的原因是,某个mod或者插件导致服务端和客户端建立了大量的连接(或者说叫握手?),然后玩家掉线导致这些连接断开,所以产生大量的报错
那么,能做到这一点的mod难道是jei?
我现在正在删除服务端的jei进行测试,同时也希望各路大佬能帮忙解答这个问题。

实测删了jei仍然存在这个问题

XuHaitian
都装了什么MOD插件。麻烦说下

XuHaitian
这个原因可能是因为 某个玩意和客户端建立连接的时候出现了错误 然后不断循环请求。??

AzureManor
客户端试图向服务器发送太多数据了, 这是Forge的一个BUG, 升级Forge试试

向文
升级下端版本