021xxljob大量close_wait

发布时间 2023-08-23 15:47:40作者: arun_yh

一、

二、服务大量CLOSE_WAIT是如何造成的?如何解决?

(1)

CLOSE_WAIT是TCP连接的一种状态,表示收到对方发来的FIN包,己方还没有发FIN包。这通常是正常的TCP连接关闭过程中的中间状态。但是如果CLOSE_WAIT状态的连接过多,可能表示有错误或异常导致大量连接无法正常关闭。

造成大量CLOSE_WAIT的原因可能有:

  1. 客户端异常退出或崩溃,没有正常关闭连接,服务端还在等待客户端的FIN包。
  2. 服务端处理缓慢或线程资源耗尽,来不及发送FIN包确认关闭连接。
  3. 网络问题导致FIN/ACK丢包,连接无法正常关闭。
  4. keepalivetimeout 配置过长,长时间没有数据传输的连接不会自动关闭。
  5. 服务端资源限制太低,不能承载更多连接,但客户端仍在建立新连接。
  6. 服务端BUG,在某些情况下没有正确关闭连接。

解决方法:

  1. 检查客户端,确保其正常关闭连接,不要留下大量半开连接。
  2. 优化服务端线程模型,加快响应速度,避免线程阻塞。
  3. 检查网络质量,修复丢包问题。
  4. 适当减小keepalive 超时时间,让长时间空闲的连接自动关闭。
  5. 根据负载调整服务端资源限制和连接上限,不要让新连接积压。
  6. 检查服务端代码,找到没有关闭连接的地方,确保连接正确关闭。
  7. 可以通过设置net.ipv4.tcp_max_tw_buckets限制系统总的CLOSE_WAIT数量。
  8. 定期检查TIME_WAIT和CLOSE_WAIT状态连接,监控系统状况。

(2)Reference: https://www.xiaolincoding.com/network/3_tcp/tcp_interview.html#tcp-%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B%E8%BF%87%E7%A8%8B%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84