因超多短连接导致的过多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.c免费云主机域名n/s/blog_781b0c850100znjd.html
修改以上参数后,连接数大为降低!!
总结:从以上分析看,主要是内部调用过多,而且又基本上是短连接,导致了大量的TIME_WAIT;从应用设计上看,应该尽量采用长连接,连接池,KEEPALIVE等技术减少对后端的连接次数,提高连接的效率,这样可以大大减少连接数,问题也就不存在了!
当然,本案例中,前端调用程序为PHP程序,因PHP本身的特性(CGI试,一个页面处理完成后,所有相关连接就断了),导致不太好使用长连接,连接池,KEEPALIVE技术;但仍可以在本页面请求内部使用,也可以一定程度上减少连接次数;

相关推荐: 深入Redux架构

之前写了一篇通过一个demo了解Redux,但对于redux的核心方法没有进行深入剖析,在此重新总结学习,完整的代码看这里。(参考了React 技术栈系列教程)什么情况需要用redux?用户的使用方式复杂不同身份的用户有不同的使用方式(比如普通用户和管理员)多…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/28 16:03
下一篇 01/28 16:03