有多少种方法可以在客户端尽快减少TIME_WAIT的数量

时间:2012-04-09 08:08:36

标签: linux sockets client time-wait

如果我们每次需要写入或读取db时都必须连接db(redis)。在某些操作之后,然后关闭连接。因为连接经常(假设必须连接然后关闭)。结果,太多的TIME_WAIT状态套接字停留在内核中。 有点像:

`netstat -vatnl | grep 6379

tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN         
tcp        0      0 127.0.0.1:36476             127.0.0.1:6379              TIME_WAIT   
tcp        0      0 127.0.0.1:37193             127.0.0.1:6379            ESTABLISHED 
tcp        0      0 127.0.0.1:36480             127.0.0.1:6379              TIME_WAIT   
tcp        0      0 127.0.0.1:36479             127.0.0.1:6379              TIME_WAIT   
tcp        0      0 127.0.0.1:36472             127.0.0.1:6379              TIME_WAIT   
tcp        0      0 127.0.0.1:36457             127.0.0.1:6379              TIME_WAIT   
tcp        0      0 127.0.0.1:36460             127.0.0.1:6379              TIME_WAIT   
tcp        0      0 127.0.0.1:36481             127.0.0.1:6379              TIME_WAIT `
  1. 我们可以在客户端重用端口吗?这样在connect()之前调用bind()和sock选择SO_REUSEPORT
  2. sysctl -w net.ipv4.tcp_timestamps=1 sysctl -w net.ipv4.tcp_tw_recycle=1<
    这种方式确实有很多帮助。但我仍然可以看到很多TIME_WAIT状态
  3. 设置套接字选择SO_LINGER l_onoff=0 ; l_liger=1 还是其他一些方法?

1 个答案:

答案 0 :(得分:1)

TIME_WAIT是tcp协议拆除过程的一部分。它们确保不接受旧连接的数据包作为新连接的一部分。所以,除非有1000个,否则应该保留原样。

虽然说source / dest是localhost,但是不应该存在旧连接数据包可以被视为新连接的情况。在您提出的解决方案中,可以使用1。解决方案2& 3可能有更广泛的含义,因此请在申请之前进行检查。