12

我有一个 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;查看打开的连接。在应用服务器上,我们可以计算每个 pid 的连接数sudo netstat -ntp | grep 3306 | grep ESTABLISHED | awk '{print $7}' | sort | uniq -c | sort -n

4

4 回答 4

7

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

于 2013-01-16T21:38:33.373 回答
2

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


于 2013-01-04T21:52:55.657 回答
0

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

我还没有找到导致问题的启动脚本中的内容。

于 2013-11-18T05:59:49.280 回答
0

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

我有这些模型

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 可以正确处理连接。

于 2015-10-30T10:42:29.770 回答