问题场景
服务器出现大量 TCP 连接状态为 CLOSE_WAIT,将系统资源耗尽,导致业务处理失败。
处理方式
重启导致问题的进程,释放 TCP 连接后服务恢复正常。
调整服务器网络参数:
net.ipv4.tcp_keepalive_time=600,tcp 连接空闲 10 分钟后发送探测包,默认是 7200 秒(两小时)net.ipv4.tcp_keepalive_intvl=15,每次探测包间隔 15 秒,默认是 75 秒net.ipv4.tcp_keepalive_probes=5,一共发送 5 次探测包,默认是 9 次
让内核尽快检测出空闲连接并释放。
分析
服务器环境是 Java、Tomcat。服务端在收到客户端 FIN 包后进入 CLOSE_WAIT,但服务端没有发送 FIN 包,具体原因没有查明。猜测的原因是
- 服务端的业务处理阻塞,导致发送不了 
FIN包 - 网络问题导致依赖的基础库 bug
 
附:TCP 连接状态图

关于我
B3log