Rails MySQL连接过多

13

我有一个Rails 2.3应用程序,它保持了太多的MySQL连接。在不到一天的时间内(约为400rpm),一个进程对我们使用的两个mysql服务器有83个已建立的连接。

我们使用的是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


83有什么问题吗?你这样惊慌失措的,就好像是8300一样。 - tadman
1
我们有84个Rails应用程序,而我们的mysql服务器最多只能连接2000个。因此,如果所有Rails应用程序都有超过23个连接,我们就会用完。我们目前的解决方案是每5个小时重新启动我们的Rails应用程序实例。 - Donald Plummer
1
我们通过在database.yml配置中添加“wait_timeout: 300”来解决了这个问题。这将在5分钟后关闭未使用的mysql连接。 - Donald Plummer
如果这个方法有效,你应该将其添加为答案并接受它。这样,人们在未来遇到相同的问题时就可以找到你的答案了。 - tadman
4个回答

7

我通过在我们的database.yml中添加“wait_timeout:300”来解决了这个问题。虽然这确实关闭了未使用的MySQL连接,但并没有说明它们来自哪里。


你在数据库查询中使用任何线程吗?例如 Thread.new { #ActiveRecord query }。这也是我遇到的问题,但将 wait_timeout 设置得太低对我来说并不是一个解决方案。 - Kache

2

一个随机的想法:分叉mysql2 gem,向Mysql2::Client#initialize中添加一些调试代码,并像平常一样运行你的应用程序。当客户端初始化时,您可以打印几行堆栈信息,以跟踪谁在导致泄漏。



0
我遇到了“连接过多(Too many connections)”错误,因为我在多个模型中使用 establish_connection 访问其他数据库。
我有这些模型。
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正确处理连接。


0

就我所知,我们的暂存服务器上也出现了同样的问题 - 它达到了与mysql的最大连接数。我发现直接从命令行运行服务而不是使用启动脚本可以解决这个问题。

我还没有找出启动脚本中导致问题的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接