tl;dr
今まで、railsにおいて、mysqlのconnection pool数は、
unicorn worker数 +1(console用) としてたけど、実際のところは1~2が良さそう.
理由は、poolingはprocess毎に行われるため.
※ 間違ってたら、指摘して頂ければ泣いて喜びます!
DB connecitonって?
アプリケーションとMySQLをつなぐ、SQL実行のための通信路
- アプリケーションからMySQLへの接続要求
- 接続要求に含まれる、パスワード・ユーザー名を元に、サーバープロセスを作成
- サーバープロセスが、アプリケーションとの通信を行う
このサーバープロセスと、アプリケーション間の通信路を、コネクションという.
1 サーバープロセスの生成には、大体 0.05秒くらいの時間がかかるとのこと.
connection poolingとは
DBとのconnectionを確立したオブジェクトを、使い回す手法のこと.
使い回すことによって、DB接続や、オブジェクト生成のオーバーヘッドを削減する.
それにより、web/dbの負荷を両方を下げる.
なお pooling の設定は、マルチプロセスサーバーと、
マルチスレッドサーバーでそれぞれ異なるため注意すること.
rails/unicornにおけるコネクションプールの設定
unicornの各プロセスは、それぞれ異なるコネクションを必要とする.
コネクションオブジェクトは、unicorn processのfork時に
それぞれのprocess毎に準備されるが、実際に接続されるのはqueryの実行時となる.
pool数を2、unicornのworker数を3としたとき、作られるコネクションの数は最大6となる.
なお、通常の利用であれば、1processで必要とされるコネクションの数は1である.
(thread等を利用していない場合を除く)
よって、ゾンビコネクションを作らないためにも、1~2のコネクション数が推奨される.
参考文献
https://devcenter.heroku.com/articles/concurrency-and-database-connections
http://www.oracle.com/technetwork/jp/articles/chapter5-1-101584-ja.htmle