问题现象

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

问题排查

如果TCP内核参数tcp_tw_recycle和tcp_timestamps同时为1,正常情况下处于TIME_WAIT状态的Socket会被快速回收,但是TIME_WAIT状态的Socket没有被快速回收。

  • 在引入SLB后,客户端访问SLB,在客户端进行抓包。可以看到客户端到SLB的SYN中的TCP Option包含有Timestamps。
  • 而在查看客户端到SLB的回包时,可以看到TCP Option中的Tiemstamps已经不存在,而客户端在直接访问后端服务器时Tiemstamps是一直存在。通过对比,发现SLB删除了TCP Option中的Timestamps字段。

问题原因

客户端通过短链接连接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

解决方案

对于没有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数量、文件描述符数量的阈值相差较大,那么可以忽略该问题。

适用于

  • 微服务引擎MSE