tl; dr:我如何让内核尽可能快速地删除TIME_WAIT /closures套接字? 我不关心数据丢失,因为我没有发送任何。
我正在一个非常孤立的机器上运行一个小testing场景。
我在同一主机上运行两个简单的C程序,应用程序的目的是将客户端套接字连接到服务器套接字并尽可能快地放下。
该应用程序速度足够快导致客户端导致“无法绑定到地址”的套接字(或者说fd)池死锁,其原因似乎是每个可用套接字插槽上的TIME_WAIT 。 我用ss -svalidation了这一点。
为了解决这个问题,我记得在sysctl下设置了三个值。 而这个已经足够解决这个问题,但由于某种原因设置如下:
net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 1
不工作了。 这只会使每秒的连接数从20k +下降到大约每分钟4个 。
我可能记得上面的sysctlnetworkingconfiguration中的错误设置,但是我以前每秒钟都会从这台机器中获得大约20k +的连接数。
那么为什么这一下子把我锁到4 /秒呢?
同一台机器,与Arch Linux最小安装对127.0.0.1运行的i7。
我尝试设置的主要信息来源是: 如何减lessTIME_WAIT中的套接字数量?
看起来tcp_fin_timeout对系统没有影响。
根据这张图片判断,即使服务器(左上angular)和客户端(右上angular)不再进行任何连接,仍然有数千个连接仍在timewait 。
在10秒的运行结束时,我设法通过了18805个连接,这个连接对于这台机器来说不是一个漏洞(因为服务器和客户端驻留在同一台机器上,所以~36k个TIME_WAITsockets)。
为什么tcp_fin_timeout在一秒之后不会丢弃连接? 这绝对是不尊重我的自定义tcp_fin_timeout操作系统。