不要轻易去打开tcp_tw_recycle!

挖坑过程

有时候,我们可能发现服务器里存在大量的TIME_WAIT,如图:
办公室

其实这2000+的TIME_WAIT真的不算多,至少低于10000条都不算多。但是TIME_WAIT本身是一个占用内存和CPU的东西,所以很多人就想把它干掉。往往这个时候,就会看到这样的答案:

1
2
3
4
打开 sysctl.conf 文件,修改以下几个参数:
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1 #只有打开这个,前俩才能生效

修改完毕之后,再/sbin/sysctl -p一下,就会看到TIME_WAIT果然大量减少,效果立竿见影!但是不要高兴太早,其实你给自己埋下了一个大坑…

TIME_WAIT是干啥的

只有主动关闭连接的一方,才会转移到TIME_WAIT。只有被动断开连接的一方会出现CLOSE_WAIT,等待close()执行完毕之后,状态变成LAST_ACK

TIME_WAIT的主要目的有2个:

  1. 避免误收延迟到达的报文:因为报文又快又慢,而若TIME_WAIT太短就会放弃原来的链接,生成新的链接,而新的链接此时接到迟到了报文,这就出现了数据错误的现象;

  2. 保证对端已经关闭了连接:由于TIME_WAIT的时间被缩短了,对端还处于LAST_ACK状态,本段发送的syn报文被直接RST掉了。

再说结论

当配置了net.ipv4.tcp_tw_recycle = 1之后,TIME_WAIT这个阶段就几乎是不存在了,因为原本它的存活时间是2MSL时间,现在改成了一个RTO,这个RTO可以远远小于2MSL的。当一个socket连接进入TIME_WAIT状态后,内核里会记录包括该socket连接对应的五元组中的对方IP等在内的一些统计数据,当然也包括从该对方IP所接收到的最近的一次数据包时间。当有新的数据包到达,只要时间晚于内核记录的这个时间,数据包都会被统统的丢掉。

那怎么会影响具体业务呢?如果你所在的网络是NAT网络,即“多个客户端,但是同一个IP出口”这样的网络环境,这样很多人其实使用的是同一个IP。但是在服务器端它是始终在跟同一个host打交道,那么在一个RTO的时间内,只能有一个客户端和自己连接成功,而其他人要连接就会出现超时的现象。

抓包体现是客户端发送了syn给服务端,但是服务端不会回复ack,然后客户端就一直处于等待,通畅以为服务器端此时卡死了,可是此时服务器的负载并不高

为什么TCP4次挥手时等待为2MSL?

MSL是Maximum Segment Lifetime,译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。TCP只有断开了才会释放占用端口等资源,新来的链接才能复用这个端口。若被动断开的一方一直收不到最后一个ACK,那就会等待retry times到了上限,会reset连接。

如果不等,释放的端口可能会重连刚断开的服务器端口,这样依然存活在网络里的老的TCP报文可能与新TCP连接报文冲突,造成数据冲突,为避免此种情况,需要耐心等待网络老的TCP连接的活跃报文全部死翘翘,2MSL时间可以满足这个需求。

正确做法

解决办法就是不建议同时开启tcp_timestamptcp_tw_recycle

正确的解决这个总是办法应该是:

1
2
3
4
net.ipv4.ip_local_port_range = 9000 6553 #默认值范围较小
net.ipv4.tcp_max_tw_buckets = 10000 #默认值较小,还可适当调小
net.ipv4.tcp_tw_reuse = 1 #
net.ipv4.tcp_fin_timeout = 10 #

插播一句,tcp_tw_recycle这个参数已经在新的内核kernel 4.12里已经去掉了。

参考资料

https://www.cnxct.com/coping-with-the-tcp-TIME_WAIT-state-on-busy-linux-servers-in-chinese-and-dont-enable-tcp_tw_recycle/
https://ieevee.com/tech/2017/07/19/tcp-tw-recycle.html#TIME_WAIT%E6%98%AF%E5%B9%B2%E5%95%A5%E7%9A%84
https://www.jianshu.com/p/893b5d7e9f30
https://www.zhihu.com/question/67013338
https://mp.weixin.qq.com/s?__biz=MzI4MjA4ODU0Ng==&mid=2650910938&idx=2&sn=8b0aa87b0f45b8465e3fe9a70f51c895&chksm=f06a55d7c71ddcc120d49d4808ac471d6ae37c105cf37cbfdf142384a3bb2fb5b94ff76b904a&mpshare=1&scene=1&srcid=0226ijYLsAmX7LdKO206NINd&key=d98c1a7a91040c8d88006a294b27c49cb4fc4e200242db9cfabf2f4d98e420954e2210ce8d72d0ea778a548e2596bef617479a59cc23a4164f93cfd0cfa85a8d460c21de5501f934e13fd0fc2e50cbce&ascene=1&uin=MTE4NTkxNTEwMA%3D%3D&devicetype=Windows+7&version=62060720&lang=zh_CN&pass_ticket=RxcXlxUz8iYDMMdnmhYX6NfQJkTaZzim2gD9j8q74LaeYI8X1cSH0njnQZXJfH8g

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------