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

http://www.cnblogs.com/lulu/p/4149312.html

http://blog.csdn.net/yah99_wolf/article/category/539413    关于TCP

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

时间: 2024-08-07 14:33:19

Tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项的相关文章

tcp_timestamps,tcp_tw_reuse,tcp_tw_recycle,tcp_fin

解决这类问题,方法很重要,最好的做法其实是阅读官方的RFC,源码,然后进行实际测试验证. tcp_timestamps,tcp_tw_reuse,tcp_tw_recycle 几篇比较好的解释这三个参数的文章: https://serverfault.com/questions/502305/linux-networking-port-exhaustionhttp://perthcharles.github.io/2015/08/27/timestamp-intro/http://perthch

TIME_WAIT与tcp_tw_reuse /tcp_tw_recycle, 开还是不开?

对于这个问题找到的一些资料, 仅供参考: ------------------------------------------------------ 关于TIME_WAIT数量太多.从上面的描述我们可以知道,TIME_WAIT是个很重要的状态,但是如果在大并发的短链接下,TIME_WAIT 就会太多,这也会消耗很多系统资源.只要搜一下,你就会发现,十有八九的处理方式都是教你设置两个参数,一个叫tcp_tw_reuse,另一个叫tcp_tw_recycle的参数,这两个参数默认值都是被关闭的,后

block使用场景和注意事项

1.使用场景:一般在一个函数的前面和后面都是重复性的东西,只有中间变化,一般使用block 2.注意事项 01:可以访问外面的变量(作用域问题) 02.里外变量同名的时候,访问里面那个(就近原则) 03.可以访问外面的变量,但是不能改外面的值,因为不是同一个地址(只是copy了一份,值传递) 04.想要改变外面变量的值,需要 变量前 加上 _block (地址传递) 05.block类型存放位置:默认是栈,对block进行copy时,放在碓中 在栈中时,访问外面对象,不会对对象 retain一次

面试官:ThreadLocal的应用场景和注意事项有哪些?

前言 ThreadLocal主要有如下2个作用 保证线程安全 在线程级别传递变量 保证线程安全 最近一个小伙伴把项目中封装的日期工具类用在多线程环境下居然出了问题,来看看怎么回事吧 日期转换的一个工具类 public class DateUtil { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static Date parse(Strin

java中修饰符的使用场景与注意事项

在java编程语言里,修饰符是出现在类的定义.属性.方法.构造器.初始化块等定义时的修饰.修饰符有分为访问修饰符和可选修饰符,他们基本都是关键字,有一个例外,就是访问修饰符除了public/protected/private之外还有一个默认访问修饰符,共4种.而可选修饰符则有abstract/const/default/final/native/static/strictfp/synchronized/transient/volatile. 修饰符 修饰场景 类 成员方法 构造方法 成员变量 局

android:PopupWindow的使用场景和注意事项

1.PopupWindow的特点 借用Google官方的说法: "A popup window that can be used to display an arbitrary view. The popup window is a floating container that appears on top of the current activity." 也就是说.popupwindow是activity上方的一个悬浮容器.它能够显示随意的视图View,非常霸气的样子. 以下看一

nginx android app 慢网络请求超时

最近遇到了android 在慢网络下面请求服务器报 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) java.net.SocketTimeoutException: failed to connect to mobile2.itanzi.com/120.27.142.146 (port 80) after 15000ms java.net.SocketTimeoutException

linux内核调优参数对比和解释

具体情况要具体分析,此处只是收集通常会利用到的一些参数的调整,做一些简单的对比和解释. [net] ######################## cat /proc/sys/net/ipv4/tcp_syncookies # 默认值:1 # 作用:是否打开SYN Cookie功能,该功能可以防止部分SYN攻击 net.ipv4.tcp_syncookies = 1 ######################## cat /proc/sys/net/ipv4/ip_local_port_ra

TIME-WAIT和CLOSE-WAIT

系统调优,你所不知道的TIME_WAIT和CLOSE_WAIT 2016-03-11 运维帮 来源微信订阅号:大房说 作者:大房 你遇到过TIME_WAIT的问题吗?   我相信很多都遇到过这个问题.一旦有用户在喊:网络变慢了.第一件事情就是,netstat -a | grep TIME_WAIT | wc -l 一下,哎呀妈呀,几千个TIME_WAIT. 然后,做的第一件事情就是:打开Google或者Bing,输入关键词:too many time wait.一定能找到解决方案,而排在最前面或