问题现象

在使用 MSE ,客户端突然出现大量的 TIME_WAIT 堆积,但是使用自建 Nacos 却没有。

可能原因

客户端通过短连接链接 SLB(服务器),而且客户端是连接的主动关闭方,同时并发比较大。

如果使用 MSE 之前客户端没有 TIME_WAIT 堆积,而使用 MSE 后产生堆积,那么在访问模式不变的情况下,极有可能在使用 MSE 之前客户端存在 TIME_WAIT socket 的快速回收或复用,那么可能是如下几个 TCP 内核参数问题:

  • net.ipv4.tcp_tw_recycle = 1
  • net.ipv4.tcp_tw_reuse = 1
  • net.ipv4.tcp_timestamps = 1

通过抓包查出由于引入 SLB 产生,SLB 删除了 TCP Option 中的 timestamps 字段。

解决方案

对于没有 TCP timestamp 信息的客户端,需要将 TCP 长连接替换短链接。
说明 在解决问题时,对于 TIME_WAIT 还需要关注如下几个限制条件:
  • 源端口数量 (net.ipv4.ip_local_port_range)
  • TIME_WAIT bucket 数量 (net.ipv4.tcp_max_tw_buckets)
  • 文件描述符数量 (max open files)

如果 TIME_WAIT 数量离源端口数量、TIME_WAIT bucket 数量和文件描述符数量的阈值较远,那么可以忽略该问题。