CLOSE_WAIT 问题分析

  |   4 评论   |   3,460 浏览

问题场景

服务器出现大量 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 连接状态图

8b538e707e964084a2161844efb023ea-tcp.jpg

---- EOF ----
点击加入开源技术 Q 群 242561391,让学习和分享成为一种习惯!

评论

  • 帅哥 回复»

    [em00][em01][em02][em03][em04][em05][em06][em07][em08][em09][em10][em11]

  • 关羽 @Vanessa 回复»

    因为tcp就是这么复杂,互联网的基石

  • 88250 回复»

    你尽然敢质疑 TCP 协议 :smirk:

  • Vanessa 回复»

    为嘛要设计的这么复杂呢?

发表评论

validate