このエントリを参考にしてRailsのコネクションプーリングを無効化するGemを作りました。
Disable the connection pooling of Rails. Connect to the database for each request.
なんだかデジャブが…
使い方
gem 'disable_connection_pooling'
を追加して、config/application.rb
で以下の設定を追加すればリクエストごとにコネクションが切断されるようになります。
module MyApp class Application.configure do ... config.active_record.disable_connection_pooling = true end end
実装
参照先のエントリほぼそのままでRackのMiddlewareにフックを入れて、リクエスト終了時にコネクションをクリアしています。
また、Middlewareでは不要なQueryCacheを削除し、起動直後にもコネクションをクリアしています。 これにより、起動直後はデータベースに接続していない状態になります。
計測
EC2でコネクションプーリング有効なRailsアプリと、無効なRailsアプリの簡単なベンチマークを取りました。
スループットの限界までは見れていませんが、無効化したほうが若干レスポンスが遅い…かな。
サーバ構成
コネクションプーリング有効
- https://gist.github.com/winebarrel/9013850
- Max trans rate: 92.28 trans/sec
コネクションプーリング無効
- https://gist.github.com/winebarrel/9013842
- Max trans rate: 91.91 trans/sec