TIME_WAIT状态过多怎么办?关于tw_reuse和tw_recycle

https://www.cnblogs.com/whx7762/p/9413787.html
https://cloud.tencent.com/developer/article/1412003
https://www.cnblogs.com/lulu/p/4149312.html

问题

这种情况比较常见,一些爬虫服务器或者WEB服务器(如果网管在安装的时候没有做内核参数优化的话)上经常会遇到这个问题,这个问题是怎么产生的呢?

1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2.可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。

现在来说如何来解决这个问题。

解决

在Windows端可以通过修改注册表里的MSL减少TIME_WAIT状态,但Linux不能修改MSL,除非修改内核宏定义重新编译。除了编译内核外,可以通过修改TIME_WAIT相关参数达到减少TIME_WAIT状态的目的:

  • tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开)

  • tw_reuse 只对客户端起作用,开启后客户端在1s内回收

  • tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。

tw_reuse

tcp_tw_reuse设置的是内核变量sysctl_tcp_tw_reuse,而这个变量仅在tcp_twsk_unique函数中使用。而这个函数的调用路径有且仅有一个:tcp_v4_connect->inet_hash_connect->__inet_check_established->twsk_unique->twsk_unique。

也就是说tcp_tw_reuse仅在TCP套接字作为客户端,调用connect时起作用。绝大部分的TCP服务器,应该不会有大量主动连接的动作(或许会连接DB等,但一般也是长连接)。因此这个选项对于TCP服务来说,基本上是无用的,完全是没必要打开,甚至可能还会给一些初级的运维工程师带来迷惑和干扰。

tw_reuse 只对客户端起作用,开启后客户端在1s内回收

tw_recycle

tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值