zoukankan      html  css  js  c++  java
  • linux 大量的TIME_WAIT解决办法

    早上登陆服务器的时候输入netstat -an|grep mysql发现存在大量TIME_WAIT状态的连接:tcp        0      0 127.0.0.1:3306              127.0.0.1:41378             TIME_WAIT
    tcp        0      0 127.0.0.1:3306              127.0.0.1:41379             TIME_WAITtcp        0      0 127.0.0.1:3306              127.0.0.1:39352             TIME_WAITtcp        0      0 127.0.0.1:3306              127.0.0.1:39350             TIME_WAIT
    tcp        0      0 127.0.0.1:3306              127.0.0.1:35763             TIME_WAIT
    tcp        0      0 127.0.0.1:3306              127.0.0.1:39372             TIME_WAIT
    tcp        0      0 127.0.0.1:3306              127.0.0.1:39373             TIME_WAIT
    tcp        0      0 127.0.0.1:3306              127.0.0.1:41176             TIME_WAIT
    通过调整内核参数解决vi /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
    然后执行/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时间 修改之后,再用命令查看TIME_WAIT连接数netstat -ae|grep “TIME_WAIT” |wc –l
    发现大量的TIME_WAIT 已不存在,MySQL进程的占用率很快就降下来的,网站访问正常。
    不过很多时候,出现大量的TIME_WAIT状态的连接,往往是因为网站程序代码中没有使用mysql.colse(),才导致大量的mysql  TIME_WAIT.

     如果你的服务器是Windows平台,可以修改下面的注册表键值:
    [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters]
    "TcpTimedWaitDelay"=dword:0000001e
    此值是TIME_WAIT状态的最长时间。缺省为240秒,最低为30秒,最高为300秒。建议为30秒。
    注释:

    1,TCP结束的过程如下:Server                             Client

    -------------- FIN -------------->  server: fin_wait_1

    <------------- ACK --------------- client: close_wait  server:fin_wait_2

    <------------- FIN  --------------- client发出fin之后就关闭

    -------------- ACK ------------->  server发出ack后进入time_wait状态
    Time_Wait的默认时间是2倍的MLS,就是240秒钟。MLS是TCP片在网上的最长存活时间。
    TIME_Wait的主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。

    现在的问题在于,4分钟的时间有点长。
    因此,Time_wait的影响,我想,首先每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。 2,To ValorZ:TIME_WAIT状态也称为2MSL等待状态,而不是2MLS,笔误吧!

    每个TCP报文在网络内的最长时间,就称为MSL(Maximum Segment Lifetime),它的作用和IP数据包的TTL类似。

    RFC793指出,MSL的值是2分钟,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。

    注意一个问题,进入TIME_WAIT状态的一般情况下是客户端,大多数服务器端一般执行被动关闭,不会进入TIME_WAIT状态,当在服务器端关闭某个服务再重新启动时,它是会进入TIME_WAIT状态的。

    举例:

     

    1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。

    2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连接还处于TIME_WAIT状态。

    阅读原文

  • 相关阅读:
    面向对象二 — — static、final、常量的初始化、this和super
    面向对象二 — — 继承、抽象类、接口
    面向对象一基础知识
    JDBC简介及其用Java连接数据库
    Java I/O 几个重要流的应用
    GUI Panel 容器以及布局管理器
    Oracle 数据库一
    Java I/O文件拷贝
    Java I/O文件的过滤 、读取、写入
    简单理解io与nio
  • 原文地址:https://www.cnblogs.com/276815076/p/5717649.html
Copyright © 2011-2022 走看看