zoukankan      html  css  js  c++  java
  • 详解TIME_WAIT过多,引起的请求502的问题。

    最近线上出现请求调用502的问题,A服务调用B服务偶然抛502错误,出现的频率也比较低。排查问题发现是请求的TIME_WAIT状态过多造成的。

    什么是TIME_WAIT?

     
    tcp关闭连接

    TIME_WAIT: TCP关闭连接中请求的发起方收到了接收方的FIN报文,并发送出了ACK报文,这时进入TIME_WAIT状态,2MSL后变成CLOSED状态了。

    TIME_WAIT的作用是什么

    (1)在进行关闭连接四路握手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允 许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。因而,要实现TCP全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节的丢失情况,主动关闭 的客户端必须维持状态信息进入TIME_WAIT状态。
    (2)允许老的重复分节在网络中消逝
    TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个 原来的迷途分节就称为lost duplicate。在关闭一个TCP连接后,马上又重新建立起一个相同的IP地址和端口之间的TCP连接,后一个连接被称为前一个连接的化身 (incarnation),那么有可能出现这种情况,前一个连接的迷途重复分组在前一个连接终止后出现,从而被误解成从属于新的化身。为了避免这个情 况,TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TCP连接的时 候,来自连接先前化身的重复分组已经在网络中消逝。

    如何解决TIME_WAIT过多问题

    在只有一台客户端和一台web服务器的情况下。构建一条TCP连接需要四个值
    <源IP地址 ,源端口,目标IP地址,目的端口> ,其中三个都是固定的,只有源端口号是可以改变的。
    客户端每次请求服务端的时候,都会获取一个新的源端口,以实现连接的唯一性。但由于原端口的数量是有限的(如果仅有6000个),而且在2MSL(等于120)秒内无法重复使用.因此最大连接并发数为6000/120=500次/秒。
    因此解决问题的方法可以分为三种:

    1:使端口可重复使用

    2:减少TIME_WAIT的等待时间

    3:使用负载均衡策略,增加可用端口

    如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决:
    编辑文件/etc/sysctl.conf,加入以下内容:

    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.ip_local_port_range = 1024 65000
    

    然后执行 /sbin/sysctl -p 让参数生效。

    net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
    net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
    net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
    net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
    net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围


    作者:jiang_liu
    链接:https://www.jianshu.com/p/102fdb8cccb7
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Rufus 真神器也
    i2c-tools命令使用 示例
    常用行棋手法
    Windows系统如何更改任务栏缩略图的大小
    微擎 钻石投票
    发卡系统
    支付宝当面付
    django 多个admin 展示不同model 定制
    Django Admin:如何清除“最近的动作”面板
    tomcat正常运行一段时间后,突然访问不了项目了, 其它根页面报404错误
  • 原文地址:https://www.cnblogs.com/gao88/p/12129443.html
Copyright © 2011-2022 走看看