Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247481
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-03-05 09:48:24

messgae中出现TCP: time wait bucket table overflow打印。
打印该信息的代码:

点击(此处)折叠或打开

  1. void tcp_time_wait(struct sock *sk, int state, int timeo)
  2. {
  3.     struct inet_timewait_sock *tw = NULL;
  4.     const struct inet_connection_sock *icsk = inet_csk(sk);
  5.     const struct tcp_sock *tp = tcp_sk(sk);
  6.     int recycle_ok = 0;

  7.     if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp)
  8.         recycle_ok = icsk->icsk_af_ops->remember_stamp(sk);

  9.     if (tcp_death_row.tw_count < tcp_death_row.sysctl_max_tw_buckets)
  10.         tw = inet_twsk_alloc(sk, state);

  11.     if (tw != NULL) {
  12.         struct tcp_timewait_sock *tcptw = tcp_twsk((struct sock *)tw);
  13.         const int rto = (icsk->icsk_rto << 2) - (icsk->icsk_rto >> 1);
  14. ....
  15. } else {
  16.         /* Sorry, if we're out of memory, just CLOSE this
  17.          * socket up. We've got bigger problems than
  18.          * non-graceful socket closings.
  19.          */
  20.         LIMIT_NETDEBUG(KERN_INFO "TCP: time wait bucket table overflow\n");
  21.     }
此段代码处于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)的代码:

点击(此处)折叠或打开

  1. struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int state)
  2. {
  3.     struct inet_timewait_sock *tw =
  4.         kmem_cache_alloc(sk->sk_prot_creator->twsk_prot->twsk_slab,
  5.                  GFP_ATOMIC);
  6. ...
  7. 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) |
给主人留下些什么吧!~~