[转帖]tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项

tcp,tw,reuse,recycle,使用,场景,注意事项 · 浏览次数 : 0

小编点评

**Linux TIME_WAIT 参数** TIME_WAIT 是一个内核参数,用于设置 TCP 连接的等待时间。当一个 TCP 连接处于 TIME_WAIT 状态时,内核不会释放资源给客户端。 **默认值** TIME_WAIT 参数的值为 0,这意味着当 TCP 连接处于 TIME_WAIT 状态时,内核不会回收该连接资源。 **参数值** * **0**:关闭 TIME_WAIT 连接回收。 * **1**:允许客户端在 1 秒内回收连接。 * **2**:允许客户端在 3.5*RTO 内回收连接。 * **60**:设置 FIN 等待时间为 60 秒。 **应用** TIME_WAIT 参数可用于控制 TCP 连接的回收速度。对于服务器,可以使用 TIME_WAIT 参数降低连接建立延迟。对于客户端,可以使用 TIME_WAIT 参数降低连接建立时间。 **注意事项** * TIME_WAIT 参数仅对客户端起作用。 * TIME_WAIT 参数对于公网服务可能不适用。 * 如果设置的 TIME_WAIT 值太低,可能会导致连接无法建立。 * 如果设置的 TIME_WAIT 值太高,可能会导致连接一直处于 TIME_WAIT 状态。 **示例** 以下命令设置 TIME_WAIT 参数为 1 秒: ```bash sysctl net.ipv4.tcp_tw_reuse=1 ``` **总结** TIME_WAIT 参数用于控制 TCP 连接的回收速度。可以通过设置不同的参数值来调整连接的建立时间。

正文

linux TIME_WAIT 相关参数:

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

注意:

- 不像Windows 可以修改注册表修改2MSL 的值,linux 需要修改内核宏定义重新编译,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

  1. slabtop
  2. 262230 251461  95%    0.25K  17482       15     69928K tw_sock_TCP
  3. ss -s
  4. Total: 259 (kernel 494)
  5. TCP: 262419 (estab 113, closed 262143, orphaned 156, synrecv 0, timewait 262143/0), ports 80
  6. Transport Total IP IPv6
  7. * 494 - -
  8. RAW 1 1 0
  9. UDP 0 0 0
  10. TCP 276 276 0
  11. INET 277 277 0
  12. 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(linux 默认2min)。

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

2. reuse、recycle

     通过timestamp的递增性来区分是否新连接,新连接的timestamp更大,那么保证小的timestamp的 fin 不会fin掉新连接,不用等2MSL。

3. reuse

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

4. recycle

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

参考:

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失败问题

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux23725 人正在系统学习中

与[转帖]tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项相似的内容:

[转帖]tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项

linux TIME_WAIT 相关参数: net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT socket

[转帖]tcp_tw_reuse、tcp_tw_recycle和tcp_timestamps

https://www.cnblogs.com/zh-dream/p/12702522.html TCP报文格式 1、TCP报文:由TCP首部和TCP数据组成 2、TCP首部:由 20字节的固定长度 + 变长字段(选项)+ 填充 组成成 3、MSS(Maximum Segment Size):占4字

[转帖]内核参数优化

net.ipv4.tcp_timestamps= 1 #服务器时间截,默念为1 net.ipv4.tcp_tw_reuse= 1 #服务器作为客户端时起作用,开启后time_wait在一秒内回收,(两端都要开启tw_timestamps=1时才有效) net.ipv4.tcp_tw_recycle=

[转帖]prometheus的TCP alloc取值

prometheus的TCP alloc取值 sockets: used:已使用的所有协议套接字总量 TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数) TCP_mem :TCP 套接字缓冲区使用量 ESTABLISHED: Tcp_tw:等待关闭的

[转帖]已经被废弃的 tcp_tw_recycle

最近准备自己动手部署测试kubernetes集群,注备写一个 hands on 的手册。突发奇想将 centos 原有的内核从3.10更新到了4.14版本,并执行一些常规的优化操作。没有想到在修改了 sysctl.conf 里面的一些参数,希望能对新的 kubernetes 性能有所帮助。 当我在其

[转帖]net.ipv4.tcp_max_tw_buckets 配置说明

https://www.jianshu.com/p/b7e991be0909 因为前些天遇到大量 TIME_WAIT 导致端口耗尽服务异常的情况,让我注意到这个参数。先说它的作用:在 TIME_WAIT 数量等于 tcp_max_tw_buckets 时,不会有新的 TIME_WAIT 产生。 tc

[转帖]k8s实践指南-排错案例-tcp_tw_recycle 引发丢包

https://www.oomspot.com/post/k8sshijianzhinanpaicuoanlitcptwrecycleyinfadiubao tcp_tw_recycle 引发丢包 tcp_tw_recycle 这个内核参数用来快速回收 TIME_WAIT 连接,不过如果在 NAT

[转帖]TCP timestamp 选项那点事

https://switch-router.gitee.io/blog/tcp-timestamp/ TCP 最早在 RFC1323 [] 中引入了 timestamp 选项, 并在后来的 RFC7323 中进行了更新。引入 timestamp 最初有两个目的:1.更精确地估算报文往返时间(roun

[转帖]TCP的半关闭、半连接、半打开

参考:《UNIX 网络编程 · 卷1 : 套接字联网API》 TCP 半关闭 如果将客户端与服务器之间的网络作为全双工管道来考虑,请求是从客户端向服务器发送,应答是从服务器向客户端发送,其如下图所示: 上图假设 RTT 为 8,且服务器没有处理时间且请求大小与应答大小相同。既然从管道发出到管道的另一

[转帖]tcp连接测试工具_六款最佳、免费的网络延迟测试工具

作为网络管理员或网络工程师,时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间,还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用你所有的时间。所以需要获得一个测试工具,以确保延迟不会影响网络的性能。 什么是延迟 延迟是网络流量的速度指标。可接受的传输时间根