tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项

本文详细解析了Linux系统中TIME_WAIT状态的相关参数设置及其影响,包括tcp_tw_reuse和tcp_tw_recycle的作用机制,适用于客户端和服务端的不同配置建议,以及如何有效应对TIME_WAIT状态带来的性能瓶颈。

转载自http://www.cnblogs.com/lulu/p/4149312.html


linux TIME_WAIT 相关参数:

net.ipv4.tcp_tw_reuse = 0    表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 0  表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_fin_timeout = 60  表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间(可改为30,一般来说FIN-WAIT-2的连接也极少)

注意:

- 不像Windows 可以修改注册表修改2MSL 的值,linux 是没有办法修改MSL的,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2状态.

- tcp_tw_reuse 和SO_REUSEADDR 是两个完全不同的东西

   SO_REUSEADDR 允许同时绑定 127.0.0.1 和 0.0.0.0 同一个端口; SO_RESUSEPORT linux 3.7才支持,用于绑定相同ip:port,像nginx 那样 fork方式也能实现

 

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

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

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

  内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量

 

对于客户端

1. 作为客户端因为有端口65535问题,TIME_OUT过多直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大。

2. tw_reuse 帮助客户端1s完成连接回收,基本可实现单机6w/s请求,需要再高就增加IP数量吧。

3. 如果内网压测场景,且客户端不需要接收连接,同时tw_recycle 会有一点点好处。

4. 业务上也可以设计由服务端主动关闭连接

 

对于服务端

1. 打开tw_reuse无效

2. 线上环境 tw_recycle 不要打开

   服务器处于NAT 负载后,或者客户端处于NAT后(这是一定的事情,基本公司家庭网络都走NAT);

 公网服务打开就可能造成部分连接失败,内网的话到时可以视情况打开;

   像我所在公司对外服务都放在负载后面,负载会把timestamp 都给清空,好吧,就算你打开也不起作用。

3. 服务器TIME_WAIT 高怎么办

   不像客户端有端口限制,处理大量TIME_WAIT Linux已经优化很好了,每个处于TIME_WAIT 状态下连接内存消耗很少,

而且也能通过tcp_max_tw_buckets = 262144 配置最大上限,现代机器一般也不缺这点内存。

    下面像我们一台每秒峰值1w请求的http 短连接服务,长期处于tw_buckets 溢出状态,

tw_socket_TCP 占用70M, 因为业务简单服务占用CPU 200% 运行很稳定。

复制代码

slabtop

262230 251461  95%    0.25K  17482       15     69928K tw_sock_TCP

 ss -s
Total: 259 (kernel 494)
TCP:   262419 (estab 113, closed 262143, orphaned 156, synrecv 0, timewait 262143/0), ports 80

Transport Total     IP        IPv6
*         494       -         -        
RAW       1         1         0        
UDP       0         0         0        
TCP       276       276       0        
INET      277       277       0        
FRAG      0         0         0    
复制代码

唯一不爽的就是:

系统日志中overflow 错误一直再刷屏,也许该buckets 调大一下了

TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow
TCP: time wait bucket table overflow

 

5. 业务上也可以设计由客户端主动关闭连接

 

原理分析

 1. MSL 由来

  发起连接关闭方回复最后一个fin 的ack,为避免对方ack 收不到、重发的或还在中间路由上的fin 把新连接给干掉了,等个2MSL,4min。

  也就是连接有谁关闭的那一方有time_wait问题,被关那方无此问题。

2. reuse、recycle

     通过timestamp的递增性来区分是否新连接,新连接的timestamp更大,那么小的timestamp的fin 就不会fin掉新连接。

3. reuse

     通过timestamp 递增性,客户端、服务器能够处理outofbind fin包

4. recycle

    对于服务端,同一个src ip,可能会是NAT后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接。

 

 细节之处还得好好阅读tcp 协议栈源码了

 

建议阅读以下参考:

Coping with the TCP TIME-WAITstate on busy Linux servers 

tcp短连接TIME_WAIT问题解决方法大全(3)——tcp_tw_recycle

 tcp短连接TIME_WAIT问题解决方法大全(4)——tcp_tw_reuse

【经验总结】tcp_tw_recycle参数引发的故障

tcp_tw_recycle和tcp_timestamps导致connect失败问题

### `tcp_tw_reuse` 和 `tcp_tw_recycle` 的区别 `tcp_tw_reuse` 允许将处于 `TIME_WAIT` 状态的套接字重新用于新的 TCP 连接,前提是该连接的四元组(源IP、源端口、目的IP、目的端口)未发生变化,并且新连接的时间戳大于旧连接的最后时间戳。这种机制特别适用于客户端频繁发起短连接的场景,可以有效减少因大量 `TIME_WAIT` 状态连接导致的资源占用问题。此功能在启用时不需要依赖于对端 IP 的时间戳单调性[^3]。 而 `tcp_tw_recycle` 则是通过更激进的方式快速回收 `TIME_WAIT` 状态的连接。它基于 per-host 的 PAWS(Protect Against Wrapped Sequence)机制,即服务端会缓存每个远程 IP 地址的最新时间戳值。当收到同一 IP 的新数据包时,如果其携带的时间戳小于之前记录的值,则认为这是一个过期的数据包并将其丢弃,从而提前终止 `TIME_WAIT` 状态[^2]。这种方式可以在一定程度上加速连接的关闭过程,但存在一定的使用限制。 两者的主要区别在于: - **作用粒度不同**:`tcp_tw_reuse` 是针对连接的四元组进行检查和复用;而 `tcp_tw_recycle` 是基于对端 IP 地址级别的检查[^2]。 - **适用环境不同**:`tcp_tw_reuse` 更加通用,适合大多数网络环境;相比之下,`tcp_tw_recycle` 在 NAT 环境下可能会出现问题,因为多个客户端共享相同的公网 IP 地址,它们之间的时间戳可能不一致,这会导致服务器错误地丢弃合法的新连接请求[^2]。 - **安全性与稳定性考虑**:由于 `tcp_tw_recycle` 对时间戳的要求更为严格,在某些情况下可能导致连接失败率上升,尤其是在客户端设备时间不同步的情况下。因此,在实际部署中通常建议优先使用 `tcp_tw_reuse` 而谨慎对待 `tcp_tw_recycle`[^1]。 ### 配置方法 要临时开启或关闭这些功能,可以通过修改对应的内核参数文件实现: ```bash # 开启 tcp_tw_reuse echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse # 关闭 tcp_tw_reuse echo 0 > /proc/sys/net/ipv4/tcp_tw_reuse # 开启 tcp_tw_recycle echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # 关闭 tcp_tw_recycle echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle ``` 为了使配置永久生效,应将相应的设置写入 `/etc/sysctl.conf` 文件中,并执行 `sysctl -p` 命令加载新的配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值