解决一个远程主机强迫关闭连接的bug

摘要

本文描述了如何解决一个rpc调用发生的问题,旨在提供一种解决思路,而不是一个具体的问题解决方案

问题描述

通过dubbo调用一个API时,间歇性的出现远程主机强迫关闭连接的问题

java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1100)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:367)
at io.netty.channel.nio.AbstractNioByteChannel NioByteUnsafe.read(AbstractNioByteChannel.java:118)atio.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:610)atio.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551)atio.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465)atio.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437)atio.netty.util.concurrent.SingleThreadEventExecutor 5.run(SingleThreadEventExecutor.java:873)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
at java.lang.Thread.run(Thread.java:745)

问题分析

  • 怀疑1
    一开始怀疑是远程主机连接太多,导致被杀掉,查看了下远程主机是否有过多的连接,发现并没有,看了下线上的问题,发现只有这一个API有问题,排除了这个问题
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  • 怀疑2
    异常栈中有netty相关的处理,可能是netty的问题,之前在dubbo升级过程中,出现过netty版本不匹配的问题
    用wireshark,抓了一下请求的包,发现调用的API数据已经返回,wireshark已经抓到了返回的数据,但是服务端发送了一个[RST,ACK]关闭了连接,而不是正常的4次挥手关闭连接。客户端是netty,服务端是jetty。所以排查了是netty的问题

  • 怀疑3
    既然不是netty,客户端的问题,那么就是服务端的问题,查看同一时间服务端的日志,发现并没有异常抛出,结合数据已经请求到,但是并没有返回给客户端,这不是web 容器jetty 的问题,而是rpc框架的问题。打开rpc框架的log,再等重现的时候,看日志。
    最后看到在Controller层request method handler抛出了异常。没有找到对应的方法。
    解决了这个问题

总结

  1. 对于一个间歇性出现的问题,一般不是那么好排查,需要小心试探,争取能够复现,如果不能复现,需要结合零碎的知识,确定问题在哪一步出现,然后结合对应的debug日志来排查出问题的根源

  2. 在刚开始的时候,根据抛出的异常[远程主机强迫关闭连接]这个关键词,去网上搜索的时候,发现都是在说客户端的问题导致的,导致一开始都认为是这个API的代码有问题,连包都不去抓,陷入了固有思维中去了,这个是需要去避免的

参考

http://blog.csdn.net/yanxi252515237/article/details/51955675

猜你喜欢

转载自blog.csdn.net/fs1360472174/article/details/79114979