- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们有一个设置,其中有很多(每秒 800 到 2400 个)传入连接到 linux 机器,我们在客户端和服务器之间有一个 NAT 设备。所以系统中还有很多 TIME_WAIT 套接字。为了克服这个问题,我们将 tcp_tw_recycle 设置为 1,但这导致了连接中断。浏览网络后,我们确实找到了为什么会发生 tcp_tw_recycle 和 NAT 设备丢帧的引用资料。
然后我们尝试将 tcp_tw_reuse 设置为 1,它在相同的设置和配置下工作正常,没有任何问题。
但是文档说,当通过 TCP 状态感知节点(例如防火墙、NAT 设备或负载平衡器)的连接可能会看到丢帧时,不应使用 tcp_tw_recycle 和 tcp_tw_reuse。连接越多,您就越有可能看到此问题。
1) tcp_tw_reuse 可以在这种场景下使用吗?2) 如果不是,linux 代码的哪一部分阻止了 tcp_tw_reuse 被用于这种情况?3) 一般来说,tcp_tw_recycle 和 tcp_tw_reuse 有什么区别?
最佳答案
默认情况下,当tcp_tw_reuse
和tcp_tw_recycle
都被禁用时,内核将确保处于TIME_WAIT
状态的套接字将保持在该状态足够长——足够长以确保属于 future 连接的数据包不会被误认为是旧连接的延迟数据包。
当您启用tcp_tw_reuse
时,处于TIME_WAIT
状态的套接字可以在它们过期之前使用,并且内核将尝试确保没有关于TCP 序列号的冲突.如果启用 tcp_timestamps
(又名 PAWS,用于防止包装序列号),它将确保不会发生这些冲突。但是,您需要在两端 启用 TCP 时间戳(至少,这是我的理解)。查看definition of tcp_twsk_unique血淋淋的细节。
当您启用 tcp_tw_recycle
时,内核会变得更加积极,并且会对远程主机使用的时间戳做出假设。它将跟踪连接处于 TIME_WAIT
状态的每个远程主机使用的最后一个时间戳,如果时间戳已正确增加,则允许重新使用套接字。但是,如果主机使用的时间戳发生变化(即时间倒退),SYN
数据包将被静默丢弃,并且连接不会建立(您将看到类似于“connect”的错误暂停”)。如果您想深入研究内核代码,definition of tcp_timewait_state_process可能是一个很好的起点。
现在,时间戳永远不应该回到过去;除非:
TIME_WAIT
套接字可能已经过期,所以这不是问题);TIME_WAIT
连接会保留一点,但其他连接可能会被 TCP RST
中断,这会释放一些空间);在后一种情况下,您可以在同一个 IP 地址后面拥有多个主机,因此,时间戳序列不同(或者,所述时间戳在每个连接上由防火墙随机化)。在那种情况下,一些主机将随机无法连接,因为它们被映射到服务器的 TIME_WAIT
桶具有较新时间戳的端口。这就是文档告诉您“NAT 设备或负载平衡器可能会因为设置而开始丢帧”的原因。
有些人建议单独保留 tcp_tw_recycle
,但启用 tcp_tw_reuse
并降低 tcp_fin_timeout
。我同意 :-)
关于linux - 断开与 tcp_tw_recycle 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893888/
我们的 API 每分钟访问 600 个请求,API 设置使用两台专用服务器,一台用于 php 进程,另一台用于 mariadb。我们为这两个服务器使用 14 个核心、128 个内存的服务器。 api
问题总结 我们有一个设置,其中有很多(每秒 800 到 2400 个)传入连接到 linux 机器,我们在客户端和服务器之间有一个 NAT 设备。所以系统中还有很多 TIME_WAIT 套接字。为了克
我有一个使用大量连接的网站和应用程序。它通常有大约 3,000 个静态打开的连接,并且可以在几秒钟的时间内接收 5,000 到 50,000 个连接尝试。 由于 TIME_WAIT 状态套接字,我遇到
我是一名优秀的程序员,十分优秀!