centos上用nginx+php搭建的web服务器忽然有报警有大量TIME_WAIT链接(5000+)
查看TCP状态数量
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
按IP链接数排行
netstat -anpt |grep TIME_WAIT |awk '{print $5}' |awk -F: '{print $1}' |sort |uniq -c |sort -rnphp
发现没有异常IP,网上查看说是要将/etc/sysctl.conf里的tcp_tw_recycle,tcp_tw_reuse置为1,但是本机就是这样设置的。。
tcp_tw_reuse:这个参数设置为1,表示容许将TIME-WAIT状态的socket从新用于新的TCP链接html
tcp_keepalive_time:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置得小一些,能够更快地清理无效的链接。
tcp_max_syn_backlog:这个参数表示TCP三次握手创建阶段接收SYN请求队列的最大长度,默认为1024,将其设置得大一些可使出现Nginx繁忙来不及accept新链接的状况时,Linux不至于丢失客户端发起的链接请求
tcp_syncookies:该参数与性能无关,用于解决TCP的SYN攻击nginx
再查看/var/log/messages有大量日志
kernel: TCP: time wait bucket table overflow
kernel: TCP: time wait bucket table overflowweb
如是查看/etc/sysctl.confcentos
net.ipv4.tcp_max_tw_buckets = 5000
这个参数表示操做系统容许TIME_WAIT套接字数量的最大值,默认是180000,5000显然过小,修改成20000保存,sysctl -p生效却发现提示
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key服务器
以上3个选项阻止桥接流量得到经过主机iptables规则,Netfilter是默认状况下启用了桥梁,若是不阻止会致使严重的混乱cookie
解决方法:运行命令modprobe bridge 后 sysctl -p没出错了网络
大量TIME_WAIT链接仍然没解决啊:
找到一篇帖子:
http://www.cnblogs.com/billyxp/archive/2014/04/28/3683559.htmlsocket
结论是
一、开启tcp_timestamp是开启tcp_tw_recycle,tcp_tw_reuse和tcp_timestamp的前提条件。tw_reuse 只对客户端起做用,开启后客户端在1s内回收;tw_recycle 对客户端和服务器同时起做用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络情况。
二、可是在nat模式下,不用将tcp_tw_recycle和tcp_timestamp同时开启,这会形成tcp超时引起故障,开启tcp_timestamp便可。tcp
如是将tcp_timestamp设置为1,不一下子,tcp链接都自动回收了,小记。