messgae中出现TCP: time wait bucket table overflow打印。
打印该信息的代码:
-
void tcp_time_wait(struct sock *sk, int state, int timeo)
-
{
-
struct inet_timewait_sock *tw = NULL;
-
const struct inet_connection_sock *icsk = inet_csk(sk);
-
const struct tcp_sock *tp = tcp_sk(sk);
-
int recycle_ok = 0;
-
-
if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp)
-
recycle_ok = icsk->icsk_af_ops->remember_stamp(sk);
-
-
if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets)
-
tw = inet_twsk_alloc(sk, state);
-
-
if (tw != NULL) {
-
struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw);
-
const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
-
....
-
} else {
-
/* Sorry, if we're out of memory, just CLOSE this
-
* socket up. We've got bigger problems than
-
* non-graceful socket closings.
-
*/
-
LIMIT_NETDEBUG(KERN_INFO "TCP: time wait bucket table overflow\n");
-
}
此段代码处于tcp套接字关闭流程,此时本机主动关闭tcp套接字,套接字状态=变为time wait,等待对端进行关闭套接字。
从代码可以看出,有两种情况可能导致这样的打印:
1、当tcp_death_row
.tw_count
< tcp_death_row
.sysctl_max_tw_buckets时,即当当前处于time wait状态的socket数量超过sysctl_max_tw_buckets(即net.ipv4.tcp_max_tw_buckets)时
当inet_twsk_alloc
(sk
, state
)返回为NULL时,出现这样的打印,再看看inet_twsk_alloc(sk, state)的代码:
-
struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int state)
-
{
-
struct inet_timewait_sock *tw =
-
kmem_cache_alloc(sk->sk_prot_creator->twsk_prot->twsk_slab,
-
GFP_ATOMIC);
-
...
-
return tw;
}
由此可以看出,当kmem_cache_alloc(从slab中分配内存)失败时,会返回NULL,最终导致这样的打印,这种情况可能的原因为内存不足。
综上,打印出现有两种可能原因:
1) 处于time wait状态的tcp套接字,超过net.ipv4.tcp_max_tw_buckets限制
2) 申请内存失败,可能原因为内存不足
该打印不影响系统的正常功能,当出现这种情况时,出现异常的套接字打印完成后会立即释放,不再等对端确认关闭。
但有隐患,如果表示处于time wait的socket太多,则可能导致无法创建新的连接。这种可能是业务代码在socket关闭的处理上有些问题,可能存在大量半关闭的socket。
另外,也可能表示内存不足,需要关注。
阅读(4113) | 评论(0) | 转发(0) |