CLOSE_WAIT 问题分析

本贴最后更新于 2946 天前,其中的信息可能已经水流花落

问题场景

服务器出现大量 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

  • TCP
    32 引用 • 38 回帖 • 2 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    944 引用 • 943 回帖
  • keepalive
    2 引用 • 4 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...