time-wait的烦恼

time-wait其实本来没有啥,但是经常成为让大家恐惧的东西。比如大家一直在试图降低web服务器、代理服务器上的time-wait数量。
time-wait本身的作用是提供全双工关闭、过时重复报文段失效,其实也没有什么。唯独是在做反向代理的时候需要特别注意time-wait过多的情况,
主要是做代理的时候容易出现tw状态过多把本地端口耗完的情况。一般缓解的方法:
1. 改成使用长连接去连后端的服务器。
2. 修改ip_local_port_range增加可用的端口范围
3. 同时打开tcp_tw_reuse和tcp_timestamps选项,这样收到最后1个包后1s后可以开始重用。这个是在tcp_ipv4.c里定义的


    /* With PAWS, it is safe from the viewpoint
       of data integrity. Even without PAWS it is safe provided sequence
       spaces do not overlap i.e. at data rates <= 80Mbit/sec.

       Actually, the idea is close to VJ's one, only timestamp cache is
       held not per host, but per port pair and TW bucket is used as state
       holder.

       If TW bucket has been already destroyed we fall back to VJ's scheme
       and use initial timestamp retrieved from peer table.
     */
    if (tcptw->tw_ts_recent_stamp &&
        (twp == NULL || (sysctl_tcp_tw_reuse &&                                                                                        
                 get_seconds() - tcptw->tw_ts_recent_stamp > 1))) {
        tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2;
        if (tp->write_seq == 0)
            tp->write_seq = 1;
        tp->rx_opt.ts_recent       = tcptw->tw_ts_recent;
        tp->rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp;
        sock_hold(sktw);
        return 1;
    }
  1. 同时打开tcp_tw_recycle和tcp_timestamps选项,开启tw的快速回收,3.5个RTO后可以回收。但是如果客户端是走NAT访问的,不能设置这个选项。

  2. 人为降低tcp_max_tw_buckets设置tw的最大数量

  3. 另外可以设置SO_LINGER选项让跳过tw状态。
此条目发表在net分类目录。将固定链接加入收藏夹。