QA@IT

aws上で複数のEC2から接続をうけるRDSのコネクション数

7288 PV

Apache + passenger + RailsでWebアプリケーションを作っています。

EC2を2台でPassengerMaxPoolSizeを20にした場合。
(database.ymlのpoolはデフォルトの5)

データベースへのconnectionは最大でいくつ貼られるのでしょうか?

2(EC2) * 5(connection pool) = 10?
2(EC2) * 20(passengerプロセス数) * 5(connection pool) = 200?

ご存知の方教えてください。

回答

ursmさんの答えに同じで普通なら2 * 20 = 40を超えることはないはずですが、passengerで普通にRailsアプリ書いてる場合にはコネクションプールの存在自体に意味がないので、pool: 1としておいたほうが明示的・宣言的でベターだという考え方もあると思います。

ただし、最近たまたまハマった問題なのですが、New Relicのように、自前のバックスレッドからDBへの接続を生成するツールが一部に存在します。

http://stackoverflow.com/questions/15536159/unicorn-and-rails-eat-up-2x-mysql-connections/15555064#15555064

このライブラリはActiveRecord::Base#connectionも使わないのでスレッドプールからのチェックアウト・チェックインもバイパスしてしまうため、pool: 1設定も効かず、想定以上の接続ができてtoo many connectionsが出てしまうという事態になりました。

めったにありませんが、ごくまれにこういう事故もあるので、接続数にはやや余裕をもってサイジングされることをおすすめします。

編集 履歴 (1)
  • 貴重な情報をありがとうございます。

    またpool:1を明示的に設定するという具体的なアドバイスや、はまるケースを指定していただき大変参考にさせていただきました。

    なかなかこういった情報が入らないので助かります。
    ありがとうございました。
    -

大抵はプロセス数と同一 (2 * 20 = 40) です。例外はスレッドを使っている場合で、このときはスレッドの数だけコネクションが生成される可能性があります。

pool はデータベースに同時アクセスするスレッドの最大数を制限する設定です。スレッドを使っていないのであれば、ひとつのプロセスが複数のコネクションを確立することはありません。

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/ConnectionPool

A connection pool synchronizes thread access to a limited number of database connections.

なお、pool: 5 としていても実際に使われるまでコネクションは生成されませんので、あえて減らす必要もないかと思います。

追記

自前で establish_connection を呼び出している場合はその数だけコネクションを張りにいくようです。
http://d.hatena.ne.jp/raugisu/20120428/1335598633

編集 履歴 (1)
  • poolと名がついているので、passengerのthreadで共有するのかと思っていました。
    疑問がとけました。

    本当にありがとうございます!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。