kubo39's blog

ただの雑記です。

コネクションプール

コネクションプールに関して。

コネクションプールを使うメリットは2つあると思っていて、

1) 接続コストの削減

例えばMySQLクライアントとMySQL鯖のばあいでいうと、接続を開始するたびにTCP 3-Way HandshakeやMySQLプロトコル自体のhandshake(認証とか)のコストがかかる(もちろんcloseするときも)。なので、接続を使いまわしてやることでこのへんのコストを削減する。(キャッシュに近いイメージ)

2) DB鯖側の負荷

DB鯖の実装によるかもしれないが、大量のクライアント接続が同時にくれば当然サーバ側にとって負担は大きくなる。workerスレッド方式の場合でスレッドプール方式を使ってスレッドの生成コストや最大スレッド数を抑えている対策をしていても、接続開始要求のソケットが待ちキューに溜まっていけば(そしてそれがサーバの処理能力を越えれば)DB鯖側がパンクするかもしれない。なので、同時接続数をおさえることでそれを回避する狙い。

1)に関しては、最近はTCP Fast Openとかの登場あって3 way handshakeのコストは下がってきた感もあるが、それでもコストにはなるだろうし、そっちはよくても認証プロトコルはだいぶ重い印象がある。

少し疑問に思っているのは 2) に関してで、これって単に負荷のかかる箇所がアプリケーション側に移っただけのように思える。アプリケーションサーバ側に大量のリクエストが飛んできてコネクションプールで捌けないとき、単にアプリケーション側がパンクして死ぬだけのような気がするんだけど、どうなんだろう。