【发布时间】: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