因超多短连接导致的过多TIME_WAIT的处理方案

近期,发现WEB服务器netstat -nap时,超多TIME_WAIT 状态的连接,每台WEB超过 2万,峰值超4万;导致服务响应变慢 ;


WEB服务器跑的是PHP程序,这些程序需要调用后端的MemCache,mysql,Redis,mongodb以及后端的 http接口服务,其中MemCache、http接口服务的调用量相对较大;


根据BAIDU的结果,分析原因为,PHP为CGI方式,一个页面请求可能会有几十次的各种内部调用,程序执行完后,连接就断开了,根据网络协议,断开的连接必然会保持一段时间的TIME_WAIT,默认是保持4分钟;如果4分钟内的请求数过高,如超过3万,本机的TCP端口数必然会不够用(默认情况下,linux临时端口号范围是(32768,61000),本机可用于调用的端口约3万个),进而导致调用后端服务阻塞,页面响应变慢;


处理方式:根据以上分析,对OS系统内核参数做修改,启用TIME_WAIT连接重用,TIME_WAIT连接回收、缩短连接保持时间、增加可用端口数:


#vi /etc/sysctl.conf

    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  #增加可用端口数,linux默认临时端口号范围是(32768,61000)


#sysctl -p                          #修改参数生效;


注意:这里有个坑,需要确认 net.ipv4.tcp_timestamps = 1(这是默认值),net.ipv4.tcp_tw_recycle = 1 这个参数才有效;


另外,net.ipv4.tcp_tw_recycle = 1 这个参数如果是在对公网用户提供的服务器,不能启用,如果启用,会导致其它问题;具体参考 (http://blog.sina.com.cn/s/blog_781b0c850100znjd.html


修改以上参数后,连接数大为降低!!


总结:从以上分析看,主要是内部调用过多,而且又基本上是短连接,导致了大量的TIME_WAIT;

从应用设计上看,应该尽量采用长连接,连接池,KEEPALIVE等技术减少对后端的连接次数,提高连接的效率,这样可以大大减少连接数,问题也就不存在了!


当然,本案例中,前端调用程序为PHP程序,因PHP本身的特性(CGI试,一个页面处理完成后,所有相关连接就断了),导致不太好使用长连接,连接池,KEEPALIVE技术;但仍可以在本页面请求内部使用,也可以一定程度上减少连接次数;


你可能感兴趣的:(TIME_WAIT,短连接)