达到最大 TIME_WAIT 套接字(尝试 tcp_fin_timeout)

达到最大 TIME_WAIT 套接字(尝试 tcp_fin_timeout)

tl;dr:我如何让内核TIME_WAIT尽可能强制且快速地丢弃/关闭套接字?我不关心数据丢失,因为我没有发送任何数据。


我目前正在一台非常孤立的机器上运行一个小测试场景。
我在同一台主机上运行两个简单的 C 程序,应用程序的目的是将客户端套接字连接到服务器套接字并尽快将其断开。

应用程序速度足够快,导致套接字(或更确切地说是 fd)池死锁,从而导致客户端出现“无法绑定到地址”的情况,而导致这种情况的原因似乎在于TIME_WAIT每个可用的套接字插槽。我已使用 验证了这一点ss -s

为了解决这个问题,我记得在 下设置了三个值sysctl。这曾经足以解决问题,但由于某种原因设置了以下内容:

net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 1

不再起作用。这只会将每秒的连接数从 20k+ 降至大约每分钟 4 个

我可能记得上面的网络配置设置有误sysctl,但我以前每秒从这台机器发出的连接数约为 20k+。
那么为什么这会突然让我的速度降到 4/秒呢?

同一台机器,i7 运行127.0.0.1Arch Linux 最低配置。
我尝试设置的主要信息来源是:如何减少TIME_WAIT中的套接字数量?

编辑:

它似乎tcp_fin_timeout对系统没有影响。
在此处输入图片描述

timewait通过这张图片来判断,即使服务器(左上)和客户端(右上)不再进行任何连接,仍然有几千个连接。

在 10 秒运行结束时,我设法建立 18,805 个连接,这对于这台机器来说并不是很多(约 36k 个 TIME_WAIT 套接字,因为服务器和客户端位于同一台机器上)。

为什么一秒钟后不会tcp_fin_timeout断开连接?这肯定是操作系统不遵守我的自定义 tcp_fin_timeout。

相关内容