Metalでは ActiveRecordの作るDB connection を自分で解放しないといけない !!

先日の Rails勉強会で松田さん(Blog, GetHub) に Metalでは ActiveRecordの作るDB connection を自分で解放しないといけないらいし・・・ という話を聞いたので、試してみた。

http://icanhascheezburger.files.wordpress.com/2008/04/funny-pictures-beaver-dam-it.jpg

たぶん、情報のソースは Don’t kill your app when using ActiveRecord in Rails Metal, release your database connections | redemption in a blog ではないかと思う。
PostgreSQL ではMySQLのように DB Connection がオーバーフローしてしまう事はありませんが、アクセス数を増やすと、処理速度が異常に遅いのです^^);

% ab -n 100 -c 10 'http://localhost:3000/・・・・・・・・・・'
 ....
Requests per second:    0.82 [#/sec] (mean)
Time per request:       12186.734 [ms] (mean)
Time per request:       1218.673 [ms] (mean, across all concurrent requests)
Transfer rate:          0.14 [Kbytes/sec] received

上のBlog記事にあるRailsのバグトラッキング情報のコメントによると、DB connection がデッドロックを起こすらしいです。そこで Blog にあるように Metal 処理の最後に ActiveRecord::Base.clear_active_connections! を入れて試してみると。

% ab -n 100 -c 10 'http://localhost:3000/・・・・・・・・・・'
 ....
Requests per second:    62.94 [#/sec] (mean)
Time per request:       158.892 [ms] (mean)
Time per request:       15.889 [ms] (mean, across all concurrent requests)
Transfer rate:          10.63 [Kbytes/sec] received

と通常の速度になりました。