您好,登录后才能下订单哦!
近期,发现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技术;但仍可以在本页面请求内部使用,也可以一定程度上减少连接次数;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。