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

发现网站登录较慢,使用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表示处理完毕,等待超时结束的请求数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值