linux 大量的TIME_WAIT解决办法

 

统计在一台前端机上高峰时间TCP链接的状况,统计命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 前端

结果:mysql

除了ESTABLISHED,能够看到链接数比较多的几个状态是:FIN_WAIT1, TIME_WAIT, CLOSE_WAIT, SYN_RECV和LAST_ACK;下面的文章就这几个状态的产生条件、对系统的影响以及处理方式进行简单描述。sql

 

发现存在大量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_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39352             TIME_WAIT
tcp        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

 

根据TCP协议定义的3次握手断开链接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短链接的服务器,若是是由服务器主动关闭客户端的链接,将致使服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,中止服务. TIME_WAIT是TCP协议用以保证被从新分配的socket不会受到以前残留的延迟重发报文影响的机制,是必要的逻辑保证.
      在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的
DWORD键,设置为60,以缩短TIME_WAIT的等待时间
服务器

http://kerry.blog.51cto.com/172631/105233/cookie

修改以后,再用
netstat -ae|grep mysql
tcp        0      0 aaaa:50408               192.168.12.13:mysql           ESTABLISHED nobody     3224651
tcp        0      0 aaaa:50417               192.168.12.13:mysql           ESTABLISHED nobody     3224673
tcp        0      0 aaaa:50419               192.168.12.13:mysql           ESTABLISHED nobody     3224675

发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,各网站访问正常!!
 以上只是暂时的解决方法,最后仔细巡查发现是前天新上线的一个系统,程序代码中没有使用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状态。数据结构

 

 

windowssocket

 

TcpTimedWaitDelay和MaxUserPort设置
描述:肯定 TCP/IP 可释放已关闭链接并重用其资源前,必须通过的时间。
关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。
此时间期间,从新打开到客户机和服务器的链接的成本少于创建新链接。
减小此条目的值容许 TCP/IP 更快地释放已关闭的链接,为新链接提供更多资源。若是运行的应用程序须要快速释放和建立新链接,并且因为 TIME_WAIT 中存在不少链接,致使低吞吐量,则调整此参数。
如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并建立名为 TcpTimedWaitDelay 的新 REG_DWORD 值。
将此值设置为十进制 30,其为十六进制 0x0000001e。
该值将等待时间设置为 30 秒。
中止并从新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。
建议值:最小值为 0x1E,它将等待时间设置为 30 秒。
MaxUserPort 描述:肯定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。
如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并建立名为 MaxUserPort 的新 REG_DWORD 值。
中止并从新启动系统。
缺省值:无 建议值:至少十进制 32768。
注:当在 Windows NT 或 Windows 2000 操做系统上调整 WebSphere Application Server 时,同时使用这两个参数。
但愿本站的知识能给您的工做、学习和生活带来方便和乐趣!  

http://blog.csdn.net/gzh0222/article/details/8491178tcp

http://www.httpclient.cn/category/time_wait/

相关文章
相关标签/搜索