WEB伺服器TCP:time wait bucket table overflow報錯排查 日誌巡檢發現,公司web伺服器一直報錯,資訊如下: Jul 5 15:40:37 mail kernel: printk: 272 messages suppressed.Jul 5 15:40:37 mail kernel: TCP: time wait bucket table overflowJul 5 15:40:37 mail kernel: TCP: time wait bucket table overflowJul 5 15:40:43 mail kernel: printk: 92 messages suppressed.Jul 5 15:40:43 mail kernel: TCP: time wait bucket table overflow (TCP:時間等待桶表) www.2cto.com 根據報錯提示,需要更改net.ipv4.tcp_max_tw_buckets這個核心參數。這個參數是系統同時保持timewait通訊端的最大數量。如果超過這個數字,time-wait通訊端將立刻被清除並列印警告資訊。這個限制僅僅是為了防止簡單的 DoS攻擊,你絕對不能過分依靠它或者人為地減小這個值,如果網路實際需要大於預設值,更應該增加這個值(如果增加了記憶體之後)。解決方案:增大 tcp_max_tw_buckets的值,並不是這個值越小越好,我看了我系統中TIME_WAIT 大部是由php-fpm產生的,是屬於正常的現象 系統在同時所處理的最大timewait sockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除並且顯示警告資訊。之所以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐千萬不要人為的降低這個限制﹐不過﹐如果網路條件需要比預設值更多﹐則可以提高它(或許還要增加記憶體)。 netstat -an | grep 9000 | awk '{print $6}' | sort | uniq -c | sort -rnnetstat -an | grep 80| awk '{print $6}' | sort | uniq -c | sort -rn www.2cto.com 排查步驟: 1. 查看伺服器網路連接情況; [root@mail ~]# netstat -pant |awk '/^tcp/ {++state[$6]} END {for(key in state) printf("%-10s\t%d\n",key,state[key]) }'TIME_WAIT 4944CLOSE_WAIT 1FIN_WAIT1 93FIN_WAIT2 66ESTABLISHED 292SYN_RECV 29CLOSING 32LAST_ACK 9LISTEN 14[root@mail ~]# www.2cto.com 2.查看核心參數vi /etc/sysctl.conf 將net.ipv4.tcp_max_tw_buckets = 5000 改為:net.ipv4.tcp_max_tw_buckets = 10000 3.使更改的核心參數生效sysctl -p 4. 再次查看伺服器網路連接情況; [root@mail ~]# netstat -pant |awk '/^tcp/ {++state[$6]} END {for(key in state) printf("%-10s\t%d\n",key,state[key]) }'TIME_WAIT 6644 CLOSE_WAIT 1FIN_WAIT1 93FIN_WAIT2 66ESTABLISHED 292SYN_RECV 29CLOSING 32LAST_ACK 9LISTEN 14 5.#再看/var/log/messages和dmesg的資訊,已經不再報錯了,看來net.ipv4.tcp_max_tw_buckets=10000暫時是夠用了 www.2cto.com 6.原因 伺服器的TCP串連數,超出了核心定義最大數。