【问题标题】:Rails MySQL Too Many ConnectionsRails MySQL 连接太多
【发布时间】:2013-01-04 19:12:19
【问题描述】:

我有一个 Rails 2.3 应用程序打开了太多 MySQL 连接。不到一天(大约 400rpm)后,一个进程与我们使用的两台 mysql 服务器建立了 83 个 ESTABLISHED 连接。

我们使用的是 mysql2 gem (0.2.18),mysql 客户端是:mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1。

如何解决这些泄漏发生的位置?在我们的测试中,我们永远无法泄漏连接,它只在生产中。

在 MySQL 中,我们可以运行 show processlist; 来查看打开的连接。在应用服务器上,我们可以用sudo netstat -ntp | grep 3306 | grep ESTABLISHED | awk '{print $7}' | sort | uniq -c | sort -n 统计每个pid 的连接数。

【问题讨论】:

  • 83怎么了?你恐慌的方式就像是 8300。
  • 有 84 个 Rails 应用,我们的 mysql 服务器最多有 2000 个连接。因此,如果所有 Rails 应用程序都有超过 23 个连接,我们就用完了。我们目前的解决方案是每 5 小时重新启动一次 Rails 应用实例。
  • 我们通过在 database.yml 配置中添加“wait_timeout: 300”解决了这个问题。这会在 5 分钟后关闭未使用的 mysql 连接。
  • 如果可行,您应该将其添加为答案并接受它。这样,如果他们将来遇到同样的问题,他们就可以找到您的答案。

标签: mysql ruby-on-rails ruby


【解决方案1】:

我通过将“wait_timeout: 300”添加到我们的 database.yml 来解决此问题。虽然这确实关闭了未使用的 mysql 连接,但它并没有解释它们的来源。

【讨论】:

  • 您是否对数据库查询使用任何线程?例如Thread.new { #ActiveRecord query }。这也是我遇到的问题,但是将 wait_timeout 设置得这么低对我来说并不是真正的解决方案。
【解决方案2】:

一个随机的想法:fork mysql2 gem,在 Mysql2::Client#initialize 中添加一些调试,然后正常运行您的应用程序。您可以在客户端初始化时打印几行堆栈,并追踪造成泄漏的原因。


【讨论】:

    【解决方案3】:

    不管怎样,我们的登台服务器上也出现了同样的问题——它达到了与 mysql 的最大连接数。我发现直接从命令行运行服务而不是使用启动脚本以某种方式解决了这个问题。

    我还没有发现是什么在启动脚本中导致了问题。

    【讨论】:

      【解决方案4】:

      我收到 Too many connections 错误,因为我使用了建立连接来访问多个模型中的其他数据库。

      我有这些模型

      class InternetReference < ActiveRecord::Base
        establish_connection :db_webserver
      end
      
      class InternetEmployee < ActiveRecord::Base
        establish_connection :db_webserver
      end
      

      解决方法是在一个抽象模型中打开连接,并从这个模型继承:

      class AppsWebserver < ActiveRecord::Base
        self.abstract_class = true
        establish_connection :apps_webserver
      end
      
      class InternetReference < AppsWebserver
      end
      
      class InternetEmployee < AppsWebserver
      end
      

      现在 Rails 可以正确处理连接了。

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 2010-11-15
        • 2020-01-24
        • 2017-10-29
        • 2014-09-08
        相关资源
        最近更新 更多