zoukankan      html  css  js  c++  java
  • 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状态的时间

    注意:

    - 不像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无效, 如果在server中用了HttpClient,那么就可以使用。

    2. 线上环境 tw_recycle 不建议打开

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

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

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

    3. 服务器TIME_WAIT 高怎么办

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

        下面像我们一台每秒峰值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

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

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

     
  • 相关阅读:
    非专业码农 JAVA学习笔记 3 抽象、封装和类(1)
    非计算机专业的码农C#学习笔记 三、变量 表达式 字符串
    非专业码农 JAVA学习笔记 2 java语言基础
    非计算机专业的码农C#学习笔记 五、数组和集合
    PSP个人软件开发工具
    端口映射
    $.proxy()
    input type=button设置高度不管用
    移动端日期控件
    mac终端下svn常用命令
  • 原文地址:https://www.cnblogs.com/sunsky303/p/12818024.html
Copyright © 2011-2022 走看看