tcp_tw_reuse vs tcp_tw_recycle:使用哪种(或两者兼而有之)?

时间:2011-06-21 13:41:31

标签: linux networking tcp

我有一个使用大量连接的网站和应用程序。它通常有大约3,000个静态打开的连接,并且可以在几秒钟的时间内接收5,000到50,000次连接尝试。

由于TIME_WAIT状态套接字,我遇到了耗尽本地端口以打开新连接的问题。即使将tcp_fin_timeout设置为较低的值(1-5),这似乎只会导致过多的开销/减速,并且它仍然偶尔会无法打开新的套接字。

我已经查看了tcp_tw_reuse和tcp_tw_recycle,但我不确定这些中哪一个是首选,或者如果同时使用这两个选项。

3 个答案:

答案 0 :(得分:53)

根据Linux documentation,您应该使用TCP_TW_REUSE标志允许重新使用TIME_WAIT状态的套接字进行新连接。

在处理必须处理TIME_WAIT状态下的许多短TCP连接的Web服务器时,这似乎是一个不错的选择。

正如here所述,TCP_TW_RECYCLE在使用负载均衡器时可能会出现一些问题......

编辑(添加一些警告;)):

@raittes在评论中提到,“使用负载均衡器时的问题”是关于面向公众的服务器。启用回收后,服务器无法区分同一NAT设备后面的不同客户端的新传入连接。

答案 1 :(得分:11)

注意:.modal-opened{ opacity: 1 !important; } 来自Linux4.12的 removed

消息来源:https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux

答案 2 :(得分:0)

pevik在描述所有可用选项时提到了interesting blog post going额外的路程。

必须将修改内核选项视为最后手段,除非您知道自己在做什么,否则通常应避免这样做。如果是那样的话,您就不需要在这里寻求帮助。因此,我建议不要这样做。

我可以提供的最合适的建议是指出描述网络连接的部分:四元组(var newArr = data.filter((x, index, self) => index === self.findIndex((t) => ( t.CUSTOMER_PERMANENT_ID === x.CUSTOMER_PERMANENT_ID))); console.log(newArr);client addressclient portserver address

如果您可以增大可用端口池,则可以接受更多并发连接:

  • 不能相乘的客户端地址和客户端端口(不受控制)
  • 服务器端口:您只能通过调整内核参数来进行更改:如果您知道需要为系统上的其他进程留出多少端口,则比更改TCP桶或重用的重要性小
  • 服务器地址:向主机添加地址并平衡主​​机上的流量:
    • 已根据您的负载或直接确定大小的L4系统的后面
    • 将您的域名解析为多个IP地址(并希望例如通过DNS在各个地址之间共享负载)