Unicornにおける DB connection poolの設定


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