大量TIME_WAIT鏈接應對辦法

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 -rn
php

發現沒有異常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 overflow
web

如是查看/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.html
socket

結論是
一、開啓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鏈接都自動回收了,小記。

相關文章
相關標籤/搜索