【问题标题】:Too many TIME_WAIT connectionsTIME_WAIT 连接过多
【发布时间】:2009-05-02 00:19:21
【问题描述】:

我们有一个相当繁忙的网站(每天 100 万页浏览量)使用 Apache mod 代理,在 TIME_WAIT 状态下,连接数(>1,000)不断超载。连接到端口 3306(mysql),但 mysql 只显示几个连接(显示进程列表)并且执行良好。 我们已经尝试改变一堆东西(保持活力开/关),但似乎没有任何帮助。所有其他系统资源都在合理范围内。

我搜索了一下,似乎表明更改了 tcp_time_wait_interval。但这似乎有点激烈。我以前在繁忙的网站上工作过,但从未遇到过这个问题。

有什么建议吗?

【问题讨论】:

    标签: apache tcp time-wait


    【解决方案1】:

    每个 time_wait 连接都是一个已经关闭的连接。

    您可能正在连接到 mysql,发出查询,然后断开连接。对页面上的每个查询重复此操作。考虑使用连接池工具,或者至少是一个保持数据库连接的全局变量。如果您使用全局,则必须在页面末尾关闭连接。希望您有一些共同的地方可以放置它,例如页脚包含。

    作为奖励,您应该获得更快的页面加载速度。 MySQL 连接速度很快,但不必重新连接速度更快。

    【讨论】:

    • 我们使用的是 PHP,所以你不能真正做连接池,因为一旦页面交付,这个过程就结束了。
    • 您仍然可以通过将 dbconnection 分配给全局变量来重用页面内的连接。而不是每次都重新创建。您还可以使用 httpd.apache.org/docs/2.2/mod/mod_dbd.html 之类的东西在 php 进程之外进行池化。
    • @trey @craig 任何 php 演示如何创建全局变量
    【解决方案2】:

    如果您的客户端应用程序使用 JDBC,您可能会遇到这个错误: http://bugs.mysql.com/bug.php?id=56979 我相信php也有同样的问题 干杯, 吉尔斯。

    【讨论】:

      【解决方案3】:

      我们有一个类似的问题,我们的网络服务器都冻结了,因为我们的 php 正在建立一个 mysql 服务器的连接,该服务器被设置为对传入的连接进行反向主机查找。

      当事情变慢时,它运行良好,但在负载下,响应时间突然飙升,所有 apache 服务器都卡在 time_wait 中。

      我们解决问题的方法是使用 xdebug 在高负载下的脚本上创建分析数据,然后查看它。 mysql_connect 调用占用了 80-90% 的执行时间。

      【讨论】:

      • 但是连接不是都来自同一个服务器、您的 Web 服务器或您的应用程序服务器吗?我认为 mysql 在第一次连接后会访问它的主机缓存。
      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2016-10-15
      • 2019-05-26
      相关资源
      最近更新 更多