[其他]
服务器time_wait的超时时间的设置
首先介绍下web下连接状态
TIME_WAIT:表示系统在等待客户端的相应
CLOSE_WAIT:表示正在断开与服务器的连接
FIN_WAIT_1:应用说他已经完成了
FIN_WAIT_2:另一边同意释放
ESTABLISHED:连接状态
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
因为time_wait一般存在1-4分钟才会自动释放,但是当web服务器访问量增加的时候,会发生time_wait来不及释放从而占据大量的服务器资源,这个时候就要手动优化服务器,使负载降下来。
发现大量的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
-------------------------------------------------
刷新内核
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 时间
这样修改完之后等一会就会发现系统负载降下来了,并且time_wait项也降了下来
nginx下查看连接状态
查看当前连接状态(并显示数量)
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
查找当前TIME_WAIT占用最多连接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20