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 连接的抓包示意图:
2.2 http 长连接
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