0

如果我们每次需要写入或读取数据库时都必须连接数据库(redis)。一些操作后关闭连接。因为连接很频繁(假设情况必须先连接然后关闭)。结果,太多的TIME_WAIT状态套接字留在内核中。就像是 :

`netstat -vatnl | grep 6379

tcp 0 0 127.0.0.1:6379 0.0.0.0:* 听         
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 已建立
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. 我们可以在客户端重用端口吗?使用 sock opt SO_REUSEPORT 在 connect() 之前调用 bind()
  2. sysctl -w net.ipv4.tcp_timestamps=1 sysctl -w net.ipv4.tcp_tw_recycle=1<
    这种方式确实有很大帮助。但是我仍然可以看到许多TIME_WAIT状态
  3. 设置套接字选择 SO_LINGERl_onoff=0 ; l_liger=1 或其他方式?
4

1 回答 1

1

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

话虽如此,由于源/目标是本地主机,因此不应将旧连接的数据包视为新连接的数据包。在您提出的解决方案中,可以使用 1 个。解决方案 2 和 3 可能具有更广泛的影响,因此请在应用之前检查。

于 2012-04-09T08:35:02.080 回答