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 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 是两个完全不同的东西

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

本文分享自微信公众号 - 马哥Linux运维(magedu-Linux)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Python Web学习笔记之TCP、UDP、ICMP、IGMP的解释和区别

TCP与UDP解释 TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输...

384120
来自专栏SDNLAB

【技术专栏】SDN交换机功能测试工具OFTest安装与使用总结

【概要】SDN功能测试工具通过发送协议数据包并根据被测试对象的反馈来判断其功能的完整性,比较典型的工具是OFTest,它模拟控制器向交换机发送OpenFlow协...

45380
来自专栏Laoqi's Linux运维专列

LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义

13030
来自专栏测试开发架构之路

计算机网络基础知识笔记(一)

TCP/IP体系结构之网络层   本章重要内容是:     1)虚拟互联网络概念     2)IP地址与物理地址的关系     3)IP地址分类和无分类域间路由...

383100
来自专栏用户画像

3.1数据链路层的功能

数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之...

9210
来自专栏北京马哥教育

又见KeepAlive

最近工作中遇到一个问题,想把它记录下来,场景是这样的: ? 从上图可以看出,用户通过Client访问的是LVS的VIP, VIP后端挂载的RealServer是...

55160
来自专栏同步博客

TCP/IP协议

  TCP/IP协议并非单指TCP协议、IP协议,它是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Int...

18730
来自专栏编程之旅

2.25 网络

发送——》接收 应用层 - 会话层 - 数据层 - 传输层 - 网络层 - 数据链路层 - 物理层

9820
来自专栏从流域到海域

在浏览器地址栏输入百度网址之后的故事(面试必考)

面试的时候,面试官经常会问这样的问题,我在浏览器地址栏输入”www.baidu.com”,之后发生了哪些事情呢,这个问题其实是想问你与网页访问有关的网络协议,下...

25250
来自专栏Danny的专栏

必备的网络常用测试命令(tracert命令)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

3.2K20

扫码关注云+社区

领取腾讯云代金券