zoukankan      html  css  js  c++  java
  • TIME_WAIT 太多的解决办法

    TIME_WAIT

    客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态为TIME_WAIT.主动关闭的一方在发送最后一个 ack 后

    就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间

    这个是TCP/IP必不可少的,也就是“解决”不了的,也就是TCP/IP设计者本来是这么设计的

    主要有两个原因

    1。防止上一次连接中的包,迷路后重新出现,影响新连接

    (经过2MSL,上一次连接中所有的重复包都会消失)

    2。可靠的关闭TCP连接

    在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

    TIME_WAIT 并不会占用很大资源的,除非受到攻击。

    还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

    1

    netstat -an

    查看下,发现系统中有很多time_wait的连接。因此直接用一下命令查看详细情况

    1

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    具体的解决方式

    vim /etc/sysctl.conf

    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 = 30

    //修改系統默认的 TIMEOUT 时间

    /sbin/sysctl -p   //保存后生效

    目前看来最好的办法是让每个TIME_WAIT早点过期。

    在linux上可以这么配置:

    #让TIME_WAIT状态可以重用,这样即使TIME_WAIT占满了所有端口,也不会拒绝新的请求造成障碍
    echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
    #让TIME_WAIT尽快回收,我也不知是多久,观察大概是一秒钟
    echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle

    很多文档都会建议两个参数都配置上,但是我发现只用修改tcp_tw_recycle就可以解决问题的了,TIME_WAIT重用TCP协议本身就是不建议打开的。

    不能重用端口可能会造成系统的某些服务无法启动,比如要重启一个系统监控的软件,它用了40000端口,而这个端口在软件重启过程中刚好被使用了,就可能会重启失败的。linux默认考虑到了这个问题,有这么个设定:

    #查看系统本地可用端口极限值
    cat /proc/sys/net/ipv4/ip_local_port_range

    用这条命令会返回两个数字,默认是:32768 61000,说明这台机器本地能向外连接61000-32768=28232个连接,注意是本地向外连接,不是这台机器的所有连接,不会影响这台机器的80端口的对外连接数。但这个数字会影响到代理服务器(nginx)对app服务器的最大连接数,因为nginx对app是用的异步传输,所以这个环节的连接速度很快,所以堆积的连接就很少。假如nginx对app服务器之间的带宽出了问题或是app服务器有问题,那么可能使连接堆积起来,这时可以通过设定nginx的代理超时时间,来使连接尽快释放掉,一般来说极少能用到28232个连接。

  • 相关阅读:
    Django Admin Cookbook-27如何在Django Admin后台中添加基于日期的过滤
    Django Admin Cookbook-26如何禁用Django Admin后台分页
    Django Admin Cookbook-25如何在模型列表页上显示更多行
    Django Admin Cookbook-24如何从两个不同的模型创建一个Django Admin后台页面
    Django Admin Cookbook-23如何在Django admin中添加嵌套的内联
    Django Admin Cookbook-22如何将一对一关系添加为Admin内联字段
    Django Admin Cookbook-21如何从Django Admin后台一个页面同时编辑多个模型
    个人收集的一些Django基础及实战教程
    Django Admin Cookbook-20如何删除模型的“添加”/“删除”按钮
    操作系统 RR轮转调度算法(C++实现)
  • 原文地址:https://www.cnblogs.com/nb-blog/p/7271905.html
Copyright © 2011-2022 走看看