021xxljob大量close_wait
一、
二、服务大量CLOSE_WAIT是如何造成的?如何解决?
(1)
CLOSE_WAIT是TCP连接的一种状态,表示收到对方发来的FIN包,己方还没有发FIN包。这通常是正常的TCP连接关闭过程中的中间状态。但是如果CLOSE_WAIT状态的连接过多,可能表示有错误或异常导致大量连接无法正常关闭。
造成大量CLOSE_WAIT的原因可能有:
- 客户端异常退出或崩溃,没有正常关闭连接,服务端还在等待客户端的FIN包。
- 服务端处理缓慢或线程资源耗尽,来不及发送FIN包确认关闭连接。
- 网络问题导致FIN/ACK丢包,连接无法正常关闭。
- keepalivetimeout 配置过长,长时间没有数据传输的连接不会自动关闭。
- 服务端资源限制太低,不能承载更多连接,但客户端仍在建立新连接。
- 服务端BUG,在某些情况下没有正确关闭连接。
解决方法:
- 检查客户端,确保其正常关闭连接,不要留下大量半开连接。
- 优化服务端线程模型,加快响应速度,避免线程阻塞。
- 检查网络质量,修复丢包问题。
- 适当减小keepalive 超时时间,让长时间空闲的连接自动关闭。
- 根据负载调整服务端资源限制和连接上限,不要让新连接积压。
- 检查服务端代码,找到没有关闭连接的地方,确保连接正确关闭。
- 可以通过设置net.ipv4.tcp_max_tw_buckets限制系统总的CLOSE_WAIT数量。
- 定期检查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