admin

[其他] 服务器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


#1楼
发帖时间:2014-9-27   |   查看数:0   |   回复数:0
游客组