统计某前端机TCP连接高峰期,统计命令:netstat-n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'除了ESTABLISHED,可以看到有几个状态有大量连接:FIN_WAIT1、TIME_WAIT、CLOSE_WAIT、SYN_RECV和LAST_ACK;下面的文章就这些状态的产生条件,对系统的影响和处理方法做简要说明。发现存在大量TIME_WAIT状态的连接tcp00127.0.0.1:3306127.0.0.1:41378TIME_WAITtcp00127.0.0.1:3306127.0.0.1:41379TIME_WAITtcp00127.0.0.1:3306127.0.0.1:39352TIME_WAITtcp00127.0.0.1:3306127.0.0.1:39350TIME_WAITtcp00127.0.0.1:3306127.0.0.1:35763TIME_WAITtcp00127.0.0.1:3306127.0.0.1:39372TIME_WAITtcp00127.0.0.1:3306127.0.0.1:39373TIME_WAITtcp00127.0.0.1:3306127.0.0.1:41176TIME_WAIT通过调整内核参数解决。编辑vi/etc/sysctl.conf添加如下内容:net.ipv4.tcp_syncookies=1net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=1net.ipv4.tcp_fin_timeout=30然后执行/sbin/sysctl-p使参数生效。net.ipv4.tcp_syncookies=1表示启用SYNCookies。当SYN等待队列溢出时,启用cookies进行处理,可以防止少量的SYN攻击。默认值为0,表示关闭;net.ipv4.tcp_tw_reuse=1表示启用重用。允许TIME-WAIT套接字被重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME-WAITsockets的快速回收,默认为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。根据TCP协议定义的3次握手断开规定,socket主动发起关闭的socket会进入TIME_WAIT状态,TIME_WAIT状态会持续2MSL(MaxSegmentLifetime)。Windows下默认为4分钟,即240秒。处于TIME_WAIT状态的套接字不能被回收。具体现象是,对于一个进程有大量短连接的服务端,如果服务端主动关闭客户端连接,那么服务端就会有大量处于TIME_WAIT状态的sockets,甚至比sockets还多处于Established状态,会严重影响服务器的处理能力,甚至消耗掉最多可用的sockets,停止服务。TIME_WAIT是TCP协议使用的一种机制,用于确保重新分配的套接字不会受到剩余的延迟重传消息的影响。这是一个必要的逻辑保证。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters中,增加一个DWORD键,名称为TcpTimedWaitDelay,设置为60,缩短TIME_WAIT的等待时间http://kerry.blog.51cto.com/1...修改后,usenetstat-ae|grepmysqltcp00aaaa:50408192.168.12.13:mysqlESTABLISHEDnobody3224651tcp00aaaa:50417192.168.12.13:mysqlESTABLISHEDnobody3224673tcp00aaaa:50419192.168.12.13:mysqlESTABLISHEDnobody3224675发现大量的TIME_WAIT已不存在,mysql进程的占用率很快就会掉下来,所有网站的访问都正常!!以上只是暂时的解决办法。最后仔细查看,发现是前天上线的新系统。程序代码中没有使用mysql.colse(),导致出现大量mysqlTIME_WAIT
