当前位置: 代码迷 >> Web前端 >> WEB服务器TCP: time wait bucket table overflow报错,排查初记
  详细解决方案

WEB服务器TCP: time wait bucket table overflow报错,排查初记

热度:790   发布时间:2012-11-18 10:51:21.0
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 overflow
Jul? 5 15:40:37 mail kernel: TCP: time wait bucket table overflow
Jul? 5 15:40:43 mail kernel: printk: 92 messages suppressed.
Jul? 5 15:40:43 mail kernel: TCP: time wait bucket table overflow
???????????????????????????????????????????????? (TCP:时间等待桶表)

?

根据报错提示,需要更改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 -rn

netstat -an | grep 80| awk '{print $6}' | sort | uniq -c | sort -rn


排查步骤:

1. 查看服务器网络连接情况;

[root@mail ~]#? netstat -pant |awk '/^tcp/ {++state[$6]} END {for(key in state) printf("%-10s\t%d\n",key,state[key]) }'
TIME_WAIT?????? 4944
CLOSE_WAIT????? 1
FIN_WAIT1?????? 93
FIN_WAIT2?????? 66
ESTABLISHED???? 292
SYN_RECV??????? 29
CLOSING???????? 32
LAST_ACK??????? 9
LISTEN????????? 14
[root@mail ~]#

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????? 1
FIN_WAIT1?????? 93
FIN_WAIT2?????? 66
ESTABLISHED???? 292
SYN_RECV??????? 29
CLOSING???????? 32
LAST_ACK??????? 9
LISTEN????????? 14

5.
#再看/var/log/messages和dmesg的信息,已经不再报错了,看来net.ipv4.tcp_max_tw_buckets=10000暂时是够用了

?

6.原因

??? 服务器的TCP连接数,超出了内核定义最大数。

  相关解决方案