避免 TIME_WAIT 连接

Him*_*tta 8 netstat time-wait

当我使用 netstat 命令时,它显示..

tcp 0 0 本地主机:18056 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:16683 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:16701 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:16888 本地主机:mysql TIME_WAIT
本地主机WAIT2TIME_WAIT 本地主机WAIT2TIME
tcp 0 0 本地主机:17725 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:17682 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:17414 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:17606 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:17737 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:16632 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:16825 本地主机:mysql TIME_WAIT 本地主机WAIT 时域主机WAIT 0 0 0 本地主机:mysql TIME_WAIT
本地主机时
tcp 0 0 本地主机:17715 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:17304 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:17217 本地主机:mysql TIME_WAIT
tcp 0 0 本地主机:18098 本地
主机:mysql TIME_WAIT
tcp 0 0 本地主机:17624 本地主机:mysql TIME_WAIT tcp 0 0 本地主机:17734 本地主机:mysql TIME_WAIT

Time_wait 连接在 2000 左右。

为了避免这种情况,我将 net.ipv4.tcp_fin_timeout=30 添加到 /etc/sysctl.conf

但是我仍然有一些问题,如何避免它?

Lad*_*ada 21

TIME_WAIT 存在是有原因的,原因是 TCP 数据包可能会延迟并无序到达。当他们应该成功时,弄乱它会导致额外的断开连接。这里对所有这些都有很好的解释

您的问题是您没有在应用程序中重用 MySQL 连接,而是在每次要运行 SQL 查询时创建一个新连接。这不仅涉及建立 TCP 连接,还涉及通过它传递身份验证凭据。这发生在每个查询(或至少每个前端 Web 请求)中,而且浪费且耗时。

如果您不知道如何在您使用的任何语言中启用持久性 MySQL 连接池,StackOverflow 将是一个询问的好地方。

  • 你可以,但它不是必需的。如果您想对 TIME_WAIT 有一个非常简单的概述,请参阅这篇文章中的图表:http://serverfault.com/questions/450055/lot-of-fin-wait2-close-wait-last-ack-and-time -等待-在-haproxy (5认同)
  • TIME_WAIT 表示连接已关闭(已发送 FIN 数据包),但我们保留端口以防止由于延迟而导致更多数据包通过。这也意味着在超时之前您不能重复使用该组合。在 Linux 上,只有端口很重要,即使在不同的 IP 地址上也不能重用它们。在遇到问题之前,您可以拥有大约 30,000 个端口,您可以增加临时端口范围以延迟处理。 (4认同)