因此,我在一个服务器上有应用程序A,它每秒向另一个服务器上的应用程序B发送710个HTTP POST消息,该应用程序在单个端口上侦听。这些连接不是保持活动状态的;它们被关闭。
几分钟后,应用程序A报告说它无法打开到应用程序B的新连接。
我在两台机器上持续运行netstat,并看到大量TIME_WAIT连接在每台机器上都处于打开状态。几乎所有显示的连接都在TIME_WAIT状态。根据在线阅读,似乎这是在每一方关闭连接后30秒钟(根据我们机器上/proc/sys/net/ipv4/tcp_fin_timeout值为30秒)所处的状态。
我在每台机器上都运行了一个脚本,不断执行以下操作:
netstat -na | grep 5774 | wc -l
以及:
netstat -na | grep 5774 | grep "TIME_WAIT" | wc -l
在每台机器上,每个应用程序似乎都会达到大约28,000左右的值,然后应用程序A报告说无法打开与应用程序B的新连接。
我读到了这个文件:/proc/sys/net/ipv4/ip_local_port_range,它提供了可以同时打开的连接总数:
$ cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
61000 - 32768 = 28232,这与我看到的大约28,000个TIME_WAIT一致。
我的问题是如何可能有这么多处于TIME_WAIT状态的连接。
每秒关闭710个连接,我应该在任意时刻看到大约710 * 30秒 = 21300个连接。我想只是因为每秒有710个连接被打开,并不意味着每秒都有710个连接被关闭...
我能想到的唯一其他原因就是操作系统缓慢地关闭连接。