Works by

Ren's blog

アプリケーションバックエンド中心に書いていきます

コネクションプールサイジングでの適切な設定

Hikari CPの本家Githubで良Wikiを見つけたのでメモ。

github.com

コネクションプールの接続プール数は、以下の式で導出した数を初期値に調節していくのが良いとのこと。

プール数 =  CPUコア数 * 2 + スピンドル数

スピンドル数は、HDDなどディスク型ストレージ台数を表します。

そして、たとえ同時接続数10,000のサービスでも、DBへのコネクションプール数は上記の式で導かれた数程度までには抑えたほうがパフォーマンスが良いと述べています。

理由として、

  • 結局、DBサーバのCPUコアあたり1スレッドしか処理できないことを考えると(1スレッド=1コネクションと考え)、2スレッド以上はコンテキストスイッチによってパフォーマンスが低下する

  • とはいえ、I/O時間を考えると必ずしも1コア1スレッドでは最大パフォーマンスが出るわけではない

  • なので、シークによるI/O時間が発生するHDDの場合は、上記式から導出されるプール数を起点にすると良い

とのこと(大体の意訳)。

別に10,000同時接続でもコネクションプール10くらいでさばけるよ、むしろプール数増やしすぎるとパフォーマンス低下するよ、という内容ですね(問い合わせ内容にもよると思いますが)。

Wiki参照元でも述べらているように、SSDでは未検証らしいのですが、I/Oを考えないとなるともっと少なくなるのでしょうか。

またネットワーク通信の待ちを考慮していないので、厳密に考えるとそこも加味する必要はあります。

とはいえ、一つの参考にはなりそうです。

参考文献

github.com