我有一个网站和应用程序使用大量连接。它通常有大约 3,000 个静态打开的连接,并且可以在几秒钟的时间内接收 5,000 到 50,000 次连接尝试。
由于 TIME_WAIT 状态套接字,我遇到了用完本地端口来打开新连接的问题。即使将 tcp_fin_timeout 设置为较低的值(1-5),这似乎也会导致太多的开销/速度变慢,并且它仍然偶尔无法打开新的套接字。
我查看了 tcp_tw_reuse 和 tcp_tw_recycle,但我不确定其中哪一个是首选,或者是否可以选择同时使用它们。
注意:
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
pevik 提到了一篇有趣的博客文章进一步描述了当时所有可用的选项。
修改内核选项必须被视为最后的选择,并且通常应该避免,除非您知道自己在做什么……如果是这种情况,您就不会在这里寻求帮助。因此,我建议不要这样做。
我能提供的最合适的建议是指出描述网络连接的部分:四元组(
client address
,client port
,server address
,server port
)。
如果可以使可用端口池更大,您将能够接受更多并发连接:
根据 VMWare 文档,主要区别是
TCP_TW_REUSE
仅适用于出站通信。
TCP_TW_REUSE
使用服务器端时间戳,一旦时间戳大于最后接收的数据包,服务器就可以使用时间等待套接字端口号进行出站通信。使用这些时间戳可以安全地丢弃来自旧连接的重复数据包或延迟数据包。
TCP_TW_RECYCLE
使用相同的服务器端时间戳,但它会影响入站和出站连接。当服务器是第一方发起连接关闭时,这非常有用。这允许从源 IP 到服务器的新客户端入站连接。由于这种差异,它会导致客户端设备位于 NAT 设备后面的问题,因为尝试联系服务器的多个设备可能无法建立连接,直到时间等待状态完全过期。