time_wait和close_wait


写的不好,参考 TCP的11种状态


TIME_WAIT 和 CLOSE_WAIT 都是TCP连接的状态,它们分别表示:

  • TIME_WAIT:表示一端主动关闭了连接,而另一端确认关闭请求后,等待一段时间(通常是几分钟),以确保所有之前发送的数据都已经到达对方,以及确保对方收到了关闭请求的确认消息,才会真正关闭连接。

  • CLOSE_WAIT:表示一端已经收到了对方的关闭请求,但是自己还有数据需要发送,因此需要先发送完数据再关闭连接。

如果出现大量的 TIME_WAIT 或 CLOSE_WAIT 状态,可能会导致服务器资源的浪费,因为每个连接都需要占用一定的系统资源。同时,如果同时存在大量的 TIME_WAIT 状态,还可能导致服务器上的可用端口数量不足,从而影响新连接的建立。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
➜  ~ netstat -nat |grep TIME_WAIT 
tcp4 0 0 127.0.0.1.64158 127.0.0.1.64157 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64161 TIME_WAIT
tcp4 0 0 127.0.0.1.64163 127.0.0.1.64162 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64166 TIME_WAIT
tcp4 0 0 127.0.0.1.64168 127.0.0.1.64167 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64170 TIME_WAIT
tcp4 0 0 127.0.0.1.64172 127.0.0.1.64171 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64173 TIME_WAIT
tcp4 0 0 127.0.0.1.64175 127.0.0.1.64174 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64176 TIME_WAIT
tcp4 0 0 127.0.0.1.64178 127.0.0.1.64177 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64181 TIME_WAIT
tcp4 0 0 127.0.0.1.64183 127.0.0.1.64182 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64185 TIME_WAIT
tcp4 0 0 127.0.0.1.64187 127.0.0.1.64186 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64190 TIME_WAIT
tcp4 0 0 127.0.0.1.64192 127.0.0.1.64191 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64194 TIME_WAIT
tcp4 0 0 127.0.0.1.64196 127.0.0.1.64195 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64197 TIME_WAIT
tcp4 0 0 127.0.0.1.64199 127.0.0.1.64198 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64200 TIME_WAIT
tcp4 0 0 127.0.0.1.64202 127.0.0.1.64201 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64203 TIME_WAIT
tcp4 0 0 127.0.0.1.64205 127.0.0.1.64204 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64206 TIME_WAIT
tcp4 0 0 127.0.0.1.64208 127.0.0.1.64207 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64211 TIME_WAIT
tcp4 0 0 127.0.0.1.64213 127.0.0.1.64212 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64214 TIME_WAIT
tcp4 0 0 127.0.0.1.64216 127.0.0.1.64215 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64217 TIME_WAIT
tcp4 0 0 127.0.0.1.7890 127.0.0.1.64220 TIME_WAIT
tcp4 0 0 172.16.13.74.64221 220.181.76.250.80 TIME_WAIT
tcp4 0 0 127.0.0.1.64219 127.0.0.1.64218 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64223 TIME_WAIT
tcp4 0 0 127.0.0.1.64225 127.0.0.1.64224 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64229 TIME_WAIT
tcp4 0 0 172.16.13.74.64232 61.151.165.102.80 TIME_WAIT
tcp4 0 0 172.16.13.74.64233 61.151.165.102.80 TIME_WAIT
tcp4 0 0 127.0.0.1.64231 127.0.0.1.64230 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64236 TIME_WAIT
tcp4 0 0 127.0.0.1.64238 127.0.0.1.64237 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64240 TIME_WAIT
tcp4 0 0 127.0.0.1.64242 127.0.0.1.64241 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64243 TIME_WAIT
tcp4 0 0 127.0.0.1.64245 127.0.0.1.64244 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64248 TIME_WAIT
tcp4 0 0 127.0.0.1.64250 127.0.0.1.64249 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64251 TIME_WAIT
tcp4 0 0 127.0.0.1.64253 127.0.0.1.64252 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64254 TIME_WAIT
tcp4 0 0 127.0.0.1.64256 127.0.0.1.64255 TIME_WAIT
tcp4 0 0 127.0.0.1.54530 127.0.0.1.64257 TIME_WAIT

netstat -a | grep TIME_WAIT | wc -l

54


TIME_WAIT的出现,是为了解决网络的丢包和网络不稳定所带来的其他问题:

  1. 防止前一个连接(五元组) 上延迟的数据包或者丢失重传的数据包,(恰巧)被后面复用的连接错误的接收

  2. 确保连接方能在时间范围内,关闭自己的连接。(其实,也是因为丢包造成的)

如果没有time_wait,会有几率,造成数据错乱,或 短暂性的连接失败

dmesg | grep “TCP established hash table”

[ 0.525614] TCP established hash table entries: 16384 (order: 5, 131072 bytes)

dmesg | grep “TCP bind hash table”

[ 0.527224] TCP bind hash table entries: 16384 (order: 6, 262144 bytes)

TIME_WAIT很多,既占内存又消耗CPU,这也是为什么很多人,看到TIME_WAIT很多,就蠢蠢欲动的想去干掉他们。其实,如果你再进一步去研究,1万条TIME_WAIT的连接,也就多消耗1M左右的内存,对现代的很多服务器,已经不算什么了。至于CPU,能减少它当然更好,但是不至于因为1万多个hash item就担忧。

查看TIME_WAIT状态的连接数量:

netstat -nat | grep : 端口号 | grep TIME_WAIT | wc -l

TIME_WAIT状态多,简单的说就是服务端主动关闭了TCP连接。

TIME_WAIT 是主动关闭的一方才会产生的,如果服务器上大量TIME_WAIT状态,说明主动关闭了很多连接


TCP频繁的建立连接,会有一些问题:

  • 三次握手建立连接、四次握手断开连接都会对性能有损耗;
  • 断开的连接断开不会立刻释放,会等待2MSL的时间,据观察是1分钟(不同系统不一样);
  • 大量TIME_WAIT会占用内存,一个连接实测是3.155KB。而且占用太多,有可能会占满端口,一台服务器最多只能有6万多个端口



Golang 优化之路——HTTP长连接

MSL:最长报文段寿命(Maximum segment lifetime, MSL)

Linux性能优化–怎样解决恼人的TIME_WAIT问题

TCP TIME-WAIT 笔记

ss命令:用来显示套接字信息的,类似于netstat,可以显示更多的信息,用于替代netstat

文章目录