我有一个Rails 2.3应用程序,它保持太多的MySQL连接打开。在不到一天的时间内(大约400rpm),一个进程有83个ESTABLISHED连接到我们使用的两个mysql服务器。
我们正在使用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的连接数。
答案 0 :(得分:7)
我通过在database.yml中添加“wait_timeout:300”来解决这个问题。虽然这确实关闭了未使用的mysql连接,但它并没有解释它们的来源。
答案 1 :(得分:2)
一个随机的想法:fork mysql2 gem,在Mysql2 :: Client#initialize中添加一些调试,然后正常运行你的app。初始化客户端时,您可以打印几行堆栈,并追踪导致泄漏的原因。
答案 2 :(得分:0)
对于它的价值,在我们的登台服务器上发生了同样的问题 - 它达到了max_connections连接到mysql的数量。我发现直接从命令行运行服务而不是使用启动脚本以某种方式解决了这个问题。
我还没有发现启动脚本中导致问题的原因。
答案 3 :(得分:0)
我收到了连接太多错误,因为我使用了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正确处理。