写的不好,参考 TCP的11种状态
TIME_WAIT 和 CLOSE_WAIT 都是TCP连接的状态,它们分别表示:
如果出现大量的 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的出现,是为了解决网络的丢包和网络不稳定所带来的其他问题:
防止前一个连接(五元组) 上延迟的数据包或者丢失重传的数据包,(恰巧)被后面复用的连接错误的接收
确保连接方能在时间范围内,关闭自己的连接。(其实,也是因为丢包造成的)
如果没有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
原文链接: https://dashen.tech/2022/03/01/time-wait和close-wait/
版权声明: 转载请注明出处.