由于 OOM 导致不健壮的 Netty 一系列诡异的行为,这次的问题分析会比上次那个更有意思一点。(备注:本文 Netty 版本是上古时代的 3.7.0.Final)
现象描述
开发的同学反馈 dubbo 客户端无法调用远程的服务,抓包来看,客户端一直在建连,每次建连成功 3 秒以后就主动断开连接。

这个现象就很奇怪了,默认情况下 dubbo 消费端对属于同一个 provider 的不同 service 只会共享一条 tcp 连接进行通信,此处就是为了跟 provider 端建立这个连接。
为什么这里三次握手成功以后会断开连接呢?这个现象其实挺诡异的,于是想到用 strace 看一下背后到底发生了什么。
strace -f -T -p 238289 -o strace-new.238289.out
在 strace 中找 connect 相关的调用,根据线程号过滤对应的日志,可以看到发生了哪些系统调用:
一开始就创建一个 socket,将该套接字设置为非阻塞,随后调用 connect 发起建立,因为是非阻塞套接字,connect 这里不阻塞直接返回 -1,随后开始等待 3s,如果 3s 内没有能建立成功,futex 超时退出。
但是这个跟抓包的行为就不一致了,从包上看,duboo 服务端有回复 SYN+ACK,但是 java 应用认为我没有收到,3s 超时。
同时,这里整个 strace 日志中没有看到对应 fd 相关 epoll_ctl 调用,也就是没有人把这个 fd 加入到 epoll 的事件监听中。
正常来说,我们的一个非阻塞的

本文详细分析了一次由于Java应用中的OOM导致的Netty客户端无限重连问题。现象表现为Dubbo客户端不断尝试建立连接并在3秒后断开。通过strace和线程分析,发现原因是New I/O boss线程因OOM退出,未执行epoll_ctl注册事件,导致连接建立后无法正常处理。解决方案包括避免OOM、优化Netty的异常处理及升级版本。
最低0.47元/天 解锁文章
486

被折叠的 条评论
为什么被折叠?



