- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
因此,我在一台服务器上有应用程序 A,它每秒向另一台服务器上的应用程序 B 发送 710 条 HTTP POST 消息,该服务器正在监听单个端口。连接不是保持事件的;他们关门了。
几分钟后,应用程序 A 报告它无法打开到应用程序 B 的新连接。
我在两台机器上连续运行 netstat,发现每台机器上都打开了大量 TIME_WAIT 连接。几乎所有显示的连接都在 TIME_WAIT 中。从在线阅读来看,这似乎是在每一方关闭连接后 30 秒(在我们的机器上为 30 秒,根据/proc/sys/net/ipv4/tcp_fin_timeout 值)的状态。
我在每台机器上运行一个脚本,该脚本一直在运行:
netstat -na | grep 5774 | wc -l
和:
netstat -na | grep 5774 | grep "TIME_WAIT" | wc -l
在应用程序 A 报告它无法打开到应用程序 B 的新连接之前,每台机器上的每个值似乎都达到了 28,000 左右。
我读过这个文件:/proc/sys/net/ipv4/ip_local_port_range 提供了一次可以打开的连接总数:
$ cat/proc/sys/net/ipv4/ip_local_port_range32768 61000
61000 - 32768 = 28232,这正好符合我看到的大约 28,000 个 TIME_WAIT。
我的问题是在 TIME_WAIT 中怎么可能有这么多连接。
似乎每秒关闭 710 个连接,我应该在给定时间看到大约 710 * 30 秒 = 21300 个连接。我想仅仅因为每秒有 710 个被打开并不意味着每秒有 710 个被关闭......
我唯一能想到的另一件事是缓慢的操作系统绕过关闭连接。
最佳答案
TCP的 TIME_WAIT 表示本地端点(这一端)已关闭连接。保持连接,以便任何延迟的数据包都可以与连接匹配并适当处理。当连接在四分钟内超时时,连接将被删除。
假设所有这些连接都是有效的,那么一切都在正常工作。您可以通过让远程端关闭连接来消除 TIME_WAIT 状态,或者您可以修改系统参数以增加回收(尽管这样做可能很危险)。
Vincent Bernat 有一个 excellent article on TIME_WAIT and how to deal with it :
Linux 内核文档对于 net.ipv4.tcp_tw_recycle
的作用不是很有帮助:
Enable fast recycling TIME-WAIT sockets. Default value is 0. It should not be changed without advice/request of technical experts.
它的兄弟,net.ipv4.tcp_tw_reuse
有更多的文档,但语言大致相同:
Allow to reuse TIME-WAIT sockets for new connections when it is safe from protocol viewpoint. Default value is 0. It should not be changed without advice/request of technical experts.
缺乏文档的唯一结果是我们发现许多调整指南建议将这两个设置都设置为 1 以减少进入 TIME-WAIT 状态的条目数。然而,如 tcp(7) 所述在手册页中,net.ipv4.tcp_tw_recycle
选项对于面向公众的服务器来说是个问题,因为它不会处理来自同一 NAT 设备后面的两台不同计算机的连接,这是一个难以检测和解决的问题等着咬你:
Enable fast recycling of TIME-WAIT sockets. Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation).
关于tcp - 是什么导致打开这么多 TIME_WAIT 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33177370/
我遇到了一个网络服务器问题,该服务器从我公司生产的设备接收信号。设备偶尔会重用它刚刚使用过的源端口。这会导致 SYN 被服务器丢弃。然后设备会重试,直到旧套接字超出服务器上的 TIME_WAIT 时间
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
我正在尝试解析主机名,然后打开/关闭与主机的套接字。 下面的代码工作正常。我遇到的问题是连接似乎没有正确关闭。我只剩下一堆 TIME_WAITS: tcp 0 0 192.16
当我在现场检查 mysql 加载时间时。我得到的结果显示连接为 TIME_WAIT。即使我关闭了每一页上的连接。有时网站不会加载说连接太多。有什么办法可以解决这个问题? 提前感谢您的任何回复或建议 最
我试图通过设置 tcp_fin_timeout 来减少连接处于 TIME_WAIT 状态的时间 详细 here : root:~# sysctl -w net.ipv4.tcp_fin_timeout
我在 C# 中有一个 TCP 隧道。我需要打开和关闭隧道,这是我在服务器和客户端之间的应用程序。我正在使用它来关闭数据连接以测试另一个应用程序。我必须使用特定的端口。 根据我等待重新连接的时间长短,在
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
这个问题在这里已经有了答案: Bind error while recreating socket (4 个答案) 关闭 8 年前。 我知道您会将其掩盖为重复项(question1、question
我设置了一个 TCP 服务器/客户端,它们按照我通常想要的方式进行通信。 我现在想做的是添加允许客户端在连接丢失后自动重新连接到服务器的功能。我无法在线找到有关如何执行此操作的完整信息。 详细信息:-
我开发了一个包含 tcp 服务器的服务。 当我重新启动我的应用程序时,有时我的应用程序无法绑定(bind) TIME_WAIT 的端口原因。 在我的应用程序中,我想在绑定(bind)失败时添加一个过程
我们有一个使用 Apache mod 代理的相当繁忙的网站(每天 100 万页浏览量),该代理在 TIME_WAIT 状态下不断因连接(>1,000)而过载。连接到端口 3306 (mysql),但
在以下情况下,当 TIME_WAIT 中的套接字收到一个段时会发生什么 a) 当它收到丢失的ACK时 b) 当发送节点想要使用服务器上的相同 src_ip:src_port 与服务器已经具有 TIME
假设我有一台服务器运行日间服务。 然后我用telnet连接这个白天服务器,服务器发送时间数据并关闭连接,现在,因为服务器是主动关闭端,应该进入TIME_WAIT状态。 那么,为什么我可以在最后一次 t
我已阅读相关问题: What is the cost of many TIME_WAIT on the server side? 但我还是迷路了。我们有两台应用服务器和一台数据库服务器(都是云服务提供
因此,我在一台服务器上有应用程序 A,它每秒向另一台服务器上的应用程序 B 发送 710 条 HTTP POST 消息,该服务器正在监听单个端口。连接不是保持事件的;他们关门了。 几分钟后,应用程序
我正在编写一个简单的 HTTP 服务器并了解 TIME_WAIT。繁重环境中的真实 Web 服务器如何处理来自数千个用户的请求,而不会在处理请求后所有套接字都卡在 TIME_WAIT 中? (不询问保
我们正在尝试调整一个应用程序,该应用程序通过 TCP 接受消息并且还使用 TCP 进行某些内部消息传递。在负载测试时,我们注意到随着对系统同时发出更多请求,响应时间显着降低(然后完全停止)。在此期间,
我们将 haproxy 1.3.26 托管在配备 2.13 GHz Intel Xeon 处理器的 CentOS 5.9 机器上,该处理器充当众多服务的 http 和 tcp 负载均衡器,峰值吞吐量约
我正在尝试在 GCP 上设置 Aerospike 集群。我正在使用 Core OS 和 Docker 来运行 Aerospike 守护进程。 我在 aerospike.conf 中为 as-node-
我们使用 Apache 服务器作为前端服务器,使用 Tomcat 服务器作为后端。前端客户端是一个 java swing 应用程序。该协议(protocol)是粗麻布的。 有时我们会收到很多小请求。当
我是一名优秀的程序员,十分优秀!