質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

5237閲覧

Railsのコネクションプーリングについて

vc3000

総合スコア196

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

2クリップ

投稿2015/08/08 12:05

比較的大きめなサイトになってくると、はりっぱなしのコネクションが多くなりすぎちゃって大変なことになってきます(1サーバ1万コネクションとかなりかねない)。

http://www.kaeruspoon.net/articles/916

これを読んで、どうしてそんなにコネクションが多くなってしまうのだろうと疑問に思って調べているのですが、どうもよく分かりません。

nginx + unicorn + railsという環境では、unicornはシングルスレッドでワーカープロセス数も固定されているので、unicornワーカープロセス1個に付きDB接続を1本持って永続化していれば十分なんじゃないでしょうか?

私が何か勘違いしているのだと思いますが、この辺の仕組みを教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ちょっと情報が古くないですか?

コネクションプールに関しては、詳しく調べた訳ではないので、実際にはどうかわかりませんが、
現在は、コネクションプールの数はdabase.ymlで設定できるようです。
RailsGuide 7 Database pooling

コネクション自体は、ActiveRecord::ConnectionAdapters::ConnectionPoolで定義されているので、
その辺のソースを一読すると良いかもです。

投稿2015/08/09 23:15

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vc3000

2015/08/10 00:46

ありがとうございます。 確かに私が張ったリンク先はちょっと古かったですね。 他に下記ページ等でコネクションプーリングをオフにした方がいいとも言われていて、この辺りをちゃんと理解したいと思って色々調べていたのでした。 http://techlife.cookpad.com/entry/2014/08/28/194147 頂いたリンク先を読んでみたところ、unicorn等のアプリケーションサーバがDB接続を多数要求した場合でも、接続の最大数はコネクションプールで指定した数に制限されるという風に解釈したのですが合ってますでしょうか? 試しに実験してみました。 【環境】 nginx 1.8.0 unicorn 4.9.0 Rails 4.2.3 Postgres 9.4.4 サーバマシン:MacBook Air Core i5 2コア。ハイパースレッディングで論理4コア クライアントマシン:同上 【方法】 下記コマンドでサーバに並列アクセスし、postgresの`SELECT * FROM pg_stat_activity ;`でコネクション数を見る。 ``` while true; do cat url_list.txt; done | xargs -P4 -n1 curl >/dev/null ``` 【設定1】 nginxのワーカープロセス=1 unicornのワーカープロセス=1 database.ymlのpool: 5 結果: unicornからのコネクション数は常に1だった。 【設定2】 nginxのワーカープロセス=4 unicornのワーカープロセス=4 database.ymlのpool: 2 結果: unicornからのコネクション数は常に4だった。 【設定3】 nginxのワーカープロセス=4 unicornのワーカープロセス=4 database.ymlのpool: 10 結果: unicornからのコネクション数は常に4だった。 この結果からすると、この構成ではDB接続数は常にunicornワーカープロセス数と等しく、poolの値は意味がないようなのですが…
rifuch

2015/08/10 01:03

DBへのコネクションプーリングを行っているのは、ActiveRecord側なので、UnicornやNginxは全然影響しないかと思います。 コネクションプーリングが4だったのは、デフォルトのコネクション数の設定が5で、なぜか設定されたプーリング数よりも1少ないコネクションを保持するため、という情報を見かけた気がします。 いずれにせよ、コネクションプーリングは、ActiveRecord::ConnectionAdapters::ConnectionPoolで管理されているので、フロントエンドのNginx,Unicornは全く関係ありません。 試しに、database.ymlでpool: 10とかに設定してみると比較できるように思います。
eripong

2015/08/10 02:10

横から失礼します。 unicorn上でActiveRecordが動いているので、 関係はあると思います。 poolの設定は、あくまで、1つのプロセス内での制限と思います。 アプリケーションサーバが複数のスレッドでrailsの処理を行う場合に、 制限が適用されるのだと思います。 1プロセスあたり1スレッドのunicornを使っている限り、 railsの処理を行うスレッドの数=unicornのワーカープロセス数>=コネクション数 になるのでは?
rifuch

2015/08/10 02:32

eripongさんのコメントも一理ありますね。この話題、私も個人的に興味があるので、時間を見て検証してみます。
hello-world

2015/08/10 02:50

Cookpadの話は、せっかく読み取り専用のDBを用意したのにコネクションをプールしたら負荷分散できないから切る、って話ですよね? コネクション数が増えて困るわーという話とはすこし違うと思います。
guest

0

ベストアンサー

Rails側のコネクション数のことではなくて、APサーバが数百台とかあるときのスレーブDB側のコネクション数のことでした。わかりにくいですね。

投稿2015/10/06 16:40

TsukasaOISHI

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukasaOISHI

2015/10/06 16:54

それから、database.ymlのpool値は複数のスレッドを立ち上げたときに使われるので、通常のRailsの使い方なら常に1本コネクションがあるだけです。そのためRailsのプロセス数(unicornのワーカー数)と同値になっていたのです。
rifuch

2015/10/06 17:56

なるほど、そういうことでしたか!腑に落ちました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問