系统kern
日志不断重复输出:
...
... kernel: : __ratelimit: 133 callbacks suppressed
... kernel: : TCP: time wait bucket table overflow
... kernel: : TCP: time wait bucket table overflow
...
... kernel: : __ratelimit: 107 callbacks suppressed
... kernel: : TCP: time wait bucket table overflow
...
系统日志中如果有大量的kernel: : TCP: time wait bucket table overflow
,则表明系统连接中有很多TIME_WAIT
状态,一种可能是受到了DDOS攻击(如果连接是从大量IP访问,并且出现大量的SYN
状态)。
__ratelimit: 133 callbacks suppressed
日志原因参考 __ratelimit解释
参考 kernel: TCP: time wait bucket table overflow 解决方法 来看看系统有多少连接
netstat -an | awk '{print $6}' | sort | uniq -c | sort -rn
显示输出
7450 TIME_WAIT
56 ESTABLISHED
56 CONNECTED
13 LISTEN
9 STREAM
7 FIN_WAIT
4
1 I-Node
1 Foreign
1 FIN_WAIT2
1 FIN_WAIT1
81 LAST_ACK
...
检查tcp_max_tw_buckets
cat /proc/sys/net/ipv4/tcp_max_tw_buckets
输出显示
10000
原来设置值还是相对较大的。我检查了用户的/etc/sysctl.conf
看到如下设置
#net.ipv4.tcp_max_tw_buckets=5000
net.ipv4.tcp_max_tw_buckets=10000
并且/etc/sysctl.conf
修改时间戳是Mar 9 18:23
,检查/var/log/kern
日志中这个报错日志最后出现时间就是这个时间戳之后
Mar 9 18:23:35 kernel: : TCP: time wait bucket table overflow
说明用户已经发现了这个问题,并通过扩大TIME_WAIT
bucket table解决了这个问题。
不过,为何会导致出现大量的TIME_WAIT
呢?
参考 Too many TIME_WAIT connections inside container: time wait bucket table overflow
TCP: time wait bucket table overflow
日志表明TCP sockets的TIME_WAIT
状态,即TW buckets已经达到了内核中分配的内存上限。
可以通过以下命令检查TIME_WAIT
数量
netstat -antp | grep TIME_WAIT | wc -l
可以通过以下命令检查 max_tw_buckets
设置
sysctl -a | grep tcp_max_tw_buckets
这个内核参数 tcp_max_tw_buckets
在 proc
中是 /proc/sys/net/ipv4/tcp_max_tw_buckets
,是一个全局设置。对于OpenVZ
这样的容器虚拟化,还有一个针对每个容器设置的/proc/sys/net/ipv4/tcp_max_tw_buckets_ub
是针对每个容器的。