Unicorn和Rails占用了2倍的MySQL连接

我为每个服务器运行10个Unicorn工作程序,他们随着时间的推移吃掉所有MySQL连接,结果是“连接太多”错误。 它从10个连接开始,但逐渐增加到20个。

当我在生产中运行以下脚本时(使用SHOW PROCESSLIST ),我可以看到每个IP(= app服务器)每个都有20个连接,它应该是10 – 令Unicorn工作者的数量增加了两倍。

 result = ActiveRecord::Base.connection.execute 'show processlist' result.group_by{|i| i[2].split(':').first }.map{|k,v| [k, v.size] } => [["192.168.1.2", 20], ["192.168.1.3", 20], ["192.168.1.4", 20], ... ] 

这是database.yml

 production: adapter: mysql2 ... pool: 1 

这是netstat:

 # netstat -an | grep :3306 tcp 0 0 192.168.1.2:58535 192.168.1.123:3306 ESTABLISHED tcp 0 0 192.168.1.2:45021 192.168.1.123:3306 ESTABLISHED tcp 0 0 192.168.1.2:58537 192.168.1.123:3306 ESTABLISHED tcp 0 0 192.168.1.2:45119 192.168.1.123:3306 TIME_WAIT ... # netstat -an | grep :3306 | wc -l 36 # netstat -an | grep :3306 | grep ESTABLISHED | wc -l 33 

我担心有一些TIME_WAIT – 它不应该存在,因为连接应该都是持久的 – 似乎工作者有更多的连接而不是必要的。 大量的免费RAM,没有交换/ OOM。

Ruby 2.0.0p0 / Rails 3.2.13

是什么导致了这个?

好的,感谢@ono的建议,我发现原因是New Relic代理在NewRelic::Agent::Database::ConnectionManager#get_connection创建了自己的连接。

https://github.com/newrelic/rpm/blob/3.5.8.72/lib/new_relic/agent/database.rb#L158

此代码调用ActiveRecord::Base.mysql2_connection ,后者又调用Mysql2::Client.new ,它不遵守连接池设置。

它只发生在事务处理缓慢时(具有讽刺意味的是,此代码会使数据库更加重载),因此编辑了newrelic.yml

 transaction_tracer: explain_enabled: false 

问题已经解决了! 我将保持这种方式,直到New Relic修复此问题。

猜测,您是否有一个中间件可以打开与数据库服务器的连接? 运行$ rake middleware来validation,sidekiq例如你的原因,或任何其他需要自己连接到你的数据库服务器的组件