http长连接及TIME_WAIT问题总结

1. 项目中 CLOSE_WAIT

1.1 现象

线上出现大量的CLOSE_WAIT连接问题,多达2万多个,新的连接很多创建错误,通过以下命令可以查看:

root@vm-node-72-41 ~]# netstat -lanp |grep CLOSE_WAIT |wc -l
26304

1.2 产生 CLOSE_WAIT 的原因

aws sdk 底层采用 libcurl 库发送http请求,维护有一个 curl 的句柄池,最大目前设置为 cpu数目*2。
http请求采用长连接的形式,每次http请求,取一个句柄,用完之后,调用 curl_easy_reset()函数重置后,放回句柄池。
如果在下次使用该句柄前,aws 服务端关闭了该连接,就会产生 CLOSE_WAIT 状态的 tcp 连接;

1.3 产生大量 CLOSE_WAIT 的原因

存在 aws client 句柄泄露,后台轮询 LogIn, 导致 client 句柄泄露。

2. 背后的原理

什么是 tcp 连接的 CLOSE_WAIT 状态呢?这要从 tcp 连接的3次握手和4次挥手说起。

2.1 tcp 连接的3次握手和4次挥手

参考: tcp连接全过程各种状态详解

示意图:

tcp 连接的抓包示意图:
http 长连接

2.2 http 长连接

http 长连接 reconnection

2.3 CLOSE_WAIT 和 TIME_WAIT

参考: 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法

3. 命令

查看tcp连接状态

[root@node7132 ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 14
ESTABLISHED 637
TIME_WAIT 4

4. 参考

原文地址:https://www.cnblogs.com/walkinginthesun/p/11848370.html