tcp_tw_reuse vs tcp_tw_recycle:使用哪个(或两者)?

问题描述 投票:0回答:4

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

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

我查看了 tcp_tw_reuse 和 tcp_tw_recycle,但我不确定其中哪一个是首选,或者是否可以选择同时使用它们。

linux networking tcp
4个回答
69
投票

根据 Linux 文档,您应该使用

TCP_TW_REUSE
标志来允许在新连接中重用处于
TIME_WAIT
状态的套接字。

在处理必须处理许多处于

TIME_WAIT
状态的短 TCP 连接的 Web 服务器时,这似乎是一个不错的选择。

here所述,

TCP_TW_RECYCLE
在使用负载均衡器时可能会导致一些问题...

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

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


42
投票

注意:

net.ipv4.tcp_tw_recycle
已从 Linux 4.12 中删除4396e46187ca tcp:删除 tcp_tw_recycle)。

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


0
投票

pevik 提到了一篇有趣的博客文章进一步描述了当时所有可用的选项。

修改内核选项必须被视为最后的选择,并且通常应该避免,除非您知道自己在做什么……如果是这种情况,您就不会在这里寻求帮助。因此,我建议不要这样做。

我能提供的最合适的建议是指出描述网络连接的部分:四元组(

client address
client port
server address
server port
)。

如果可以使可用端口池更大,您将能够接受更多并发连接:

  • 您无法相乘的客户端地址和客户端端口(超出您的控制)
  • 服务器端口:您只能通过调整内核参数来更改:如果您知道需要为系统上的其他进程保留多少端口,那么与更改 TCP 存储桶或重用相比不太重要
  • 服务器地址:向您的主机添加地址并平衡其上的流量:
    • L4 系统背后已根据您的负载调整大小或直接
    • 将您的域名解析为多个 IP 地址(例如希望通过 DNS 跨地址共享负载)

0
投票

根据 VMWare 文档,主要区别是

TCP_TW_REUSE
仅适用于出站通信。

  • TCP_TW_REUSE
    使用服务器端时间戳,一旦时间戳大于最后接收的数据包,服务器就可以使用时间等待套接字端口号进行出站通信。使用这些时间戳可以安全地丢弃来自旧连接的重复数据包或延迟数据包。

  • TCP_TW_RECYCLE
    使用相同的服务器端时间戳,但它会影响入站和出站连接。当服务器是第一方发起连接关闭时,这非常有用。这允许从源 IP 到服务器的新客户端入站连接。由于这种差异,它会导致客户端设备位于 NAT 设备后面的问题,因为尝试联系服务器的多个设备可能无法建立连接,直到时间等待状态完全过期。

© www.soinside.com 2019 - 2024. All rights reserved.