您的位置:首页 > 理论基础 > 计算机网络

20090802解决网站网络问题--出现大量TIME_WAIT 的问题

2015-05-13 21:36 429 查看
发现网站登录较慢,使用netstat等网络管理命令检测,发现有大量的TIME_WAIT,经调整后,恢复正常。
今天,发现网站登录较慢,使用netstat等网络管理命令检测,发现有大量的TIME_WAIT,经调整后,恢复正常。
调整方法:
1:调整web服务器参数:开启Keep-Alive选项,适当调整有关的连接参数
2:调整 /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 让参数生效。
调整效果:TIME_WAIT数量保持稳定,系统恢复正常

参考资料:
=========================================================
1:发现大量的TIME_WAIT解决办法
原文出自 “kerry学网络”博客:http://kerry.blog.51cto.com/172631/105233
今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%,可以肯定的是mysql连接出现问题:
netstat -an
192.168.12.13:3306 192.168.12.12:30443 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30444 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30445 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30446 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30447 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30448 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30449 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30450 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30451 TIME_WAIT
192.168.12.13:3306 192.168.12.12:30452 TIME_WAIT
... ...
根据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_MACHINESYSTEMCurrentControlSetServicesTcpipParameters,添加名为TcpTimedWaitDelay的
DWORD键,设置为60,以缩短TIME_WAIT的等待时间

登陆到web服务器(linux):

netstat -ae |grep mysql
tcp 0 0 aaaa:53045 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53044 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53051 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53050 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53049 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53048 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53055 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53054 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53053 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53052 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53059 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53058 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53057 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53056 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53063 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53062 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53061 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53060 192.168.12.3:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53067 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53066 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53065 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53064 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa53071 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53070 192.168.12.13:mysql TIME_WAIT root 0
tcp 0 0 aaaa:53069 192.168.12.13:mysql TIME_WAIT root 0
发现系统存在大量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 时间

修改之后,再用
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

===========================================
2:phprpc+mysq l產生一堆TIME_WAIT連線
来源:http://www.phprpc.org/forum/viewthread.php?tid=30
Q:這個問題之前曾問過andot 大,只是因為一直都沒有解決,所以又提上來問看看大家...
Client端為PHPRPC 3.0 for JavaScript, 而Server為PHP,從Client每10秒執行Server上PHP的函式..這個PHP函式會有連結MySQL資料庫..
如此下來..每執行一次..整支PHP程序好像會重新執行一次..所以就又會產生一個MySQL連線..使用 netstat查看會看到一堆MySQL的連線..而且狀態都是TIME_WAIT
奇怪的是..在Windows系統上,是會看到一堆3306 port,但是,在Linux系統上,則是一堆80 port
照理說..php連結mysql資料庫..當網頁執行完畢後..就會關閉這個連線,但為什麼我執行起來反而是愈來愈多...這種現像是正常的嗎..??
A:对于 HTTP 来说,要保持连接需要服务器开启 Keep-Alive 选项,并且客户端和代理服务器都支持,才能生效。不过很不幸,IIS 对 PHP 不支持永久连接特性。对于 PHP 连接 MySQL,可以启用永久连接,那样也可以保持连接不断开,但是 PHP 到 MySQL 的永久连接只有在 Apache 上有效(你可以查一下 PHP 手册数据库永久连接那一章),但是我从来没发现它还用过,呵呵。总之,TIME_WAIT 是正常的,只要是 TCP 协议,断开链接时总会有这个过程。
===========================================
3:mysql time_wait 超多
来源:http://linux.chinaunix.net/bbs/viewthread.php?tid=906408
Q:
tcp 0 0 192.168.113.101:40312 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40315 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40293 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40289 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40291 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40300 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40296 192.168.113.202:3306 TIME_WAIT
tcp 0 0 192.168.113.101:40647 192.168.113.172:3306 TIME_WAIT
[root@web1 etc]# netstat -n |grep :3306|wc -l
2726
[root@web1 etc]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 508
FIN_WAIT1 53
CLOSING 1
TIME_WAIT 4782
[root@web1 etc]#
一般的优化都已经做过:
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=1800
net.ipv4.window_scaling=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_reuse=1
大伙帮看看是什么原因?
是php调用MYSQL时执行后没有关闭连接造成的吗?默认情况下PHP也会自动关闲的啊。
郁闷!
A1:参考一下《TCPIP详解:卷一》第18章 TCP连接的建立与终止
TIME_WAIT是最后一个状态了,它要等2MLS秒,在这期间,这个socket不允许再复用
============================================================================
4:Linux下查看Apache的请求数
来源: http://www.ccvita.com 
http://www.phpchina.com/html/28/n-33728.html]
在Linux下查看Apache的负载情况,以前也说过,最简单有有效的方式就是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apache Server Status的情况下,或安装的是其他的Web Server,比如Nginx的时候,下面的命令就体现出作用了。
ps -ef|grep httpd|wc -l命令
#ps -ef|grep httpd|wc -l
1388
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。
netstat -nat|grep -i “80″|wc -l命令
#netstat -nat|grep -i “80″|wc -l
4341
netstat -an会打印系统当前网络链接状态,而grep -i “80″是用来提取与80端口有关的连接的, wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数。

netstat -na|grep ESTABLISHED|wc -l命令
#netstat -na|grep ESTABLISHED|wc -l
376
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。
最终返回的数字就是当前所有80端口的已建立连接的总数。
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’命令
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
FIN_WAIT_1 286
FIN_WAIT_2 960
SYN_SENT 3
LAST_ACK 32
CLOSING 1
CLOSED 36
SYN_RCVD 144
TIME_WAIT 2520
ESTABLISHED 352
这条语句是在张宴那边看到,据说是从新浪互动社区事业部技术总监王老大那儿获得的,非常不错。返回参数的说明如下:
SYN_RECV表示正在等待处理的请求数;
ESTABLISHED表示正常数据传输状态;
TIME_WAIT表示处理完毕,等待超时结束的请求数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: