我有一个网站和应用程序,使用了大量的连接。它通常有约3,000个静态打开的连接,并且在几秒钟的时间内可以接收到5,000到50,000个连接尝试。
由于TIME_WAIT状态套接字,我曾经遇到过无法打开新连接的问题。即使将tcp_fin_timeout设置为低值(1-5),这似乎仍然会导致太多的开销/减速,并且偶尔仍然无法打开新套接字。
我已经查看了tcp_tw_reuse和tcp_tw_recycle,但我不确定哪个是首选项,或者是否可以同时使用它们两个。
我有一个网站和应用程序,使用了大量的连接。它通常有约3,000个静态打开的连接,并且在几秒钟的时间内可以接收到5,000到50,000个连接尝试。
由于TIME_WAIT状态套接字,我曾经遇到过无法打开新连接的问题。即使将tcp_fin_timeout设置为低值(1-5),这似乎仍然会导致太多的开销/减速,并且偶尔仍然无法打开新套接字。
我已经查看了tcp_tw_reuse和tcp_tw_recycle,但我不确定哪个是首选项,或者是否可以同时使用它们两个。
TIME_WAIT
状态仅适用于关闭连接的一方(即“主动关闭”),它高度依赖于协议。对于像原始问题所引用的HTTP协议,它将是服务器端。 - Bernard Rosset注意: net.ipv4.tcp_tw_recycle
已在Linux 4.12中被移除 (4396e46187ca tcp: remove tcp_tw_recycle)。
来源:https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux
pevik提到了一篇有趣的博客文章, 在描述所有可用选项时走了额外的路程。
修改内核选项必须被视为最后的选择,通常应该避免,除非你知道自己在做什么...如果是这种情况,你就不会在这里寻求帮助。因此,我建议不要这样做。
我能提供的最合适的建议是指出描述网络连接的部分:四元组(客户端地址
、客户端端口
、服务器地址
、服务器端口
)。
如果你可以扩大可用端口池,你将能够接受更多并发连接:
客户端地址和客户端端口无法更改(不在您的控制范围内) 服务器端口:只能通过调整内核参数进行更改:如果您知道需要为系统上的其他进程留出多少端口,则比更改TCP存储桶或重用更不关键。 服务器地址:向主机添加地址并在其中平衡流量:TCP_TW_REUSE
仅适用于出站通信。
TCP_TW_REUSE
使用服务器端时间戳,一旦时间戳大于上次接收到的数据包,服务器就可以将time-wait套接字端口号用于出站通信。使用这些时间戳可以安全地丢弃旧连接的重复数据包或延迟数据包。
TCP_TW_RECYCLE
也使用相同的服务器端时间戳,但它影响入站和出站连接。当服务器是第一方发起连接关闭时,这很有用。这允许源IP到服务器的新客户端入站连接。由于这种差异,它会导致客户端设备位于NAT设备后面的问题,因为多个设备尝试联系服务器可能无法建立连接,直到Time-Wait状态完全过期。