MySQL コネクションプール有り無しでの速度検証
MySQLの接続コスト低いらしいってことで確認。
DBのコネクションプール張るとDB障害の時の挙動がめんどくさかったり、DBのIPアドレスがホスト名に対してラウンドロビンで複数返ってくるようなタイプの構成(Auroraの読み込みエンドポイントみたいなヤツ ※こちらの記事参照)の時に、ちゃんと分散できてるのっていうのが気になったりで、プールの有り無しの差が無視できるレベルだったら使いたくないよねっていう話。
環境
- MySQL 5.7
- Python 3.6
- DB接続に-connector-python使用
※ローカルPCのMySQLに同じPCのPythonでシーケンシャルにDB接続&切断実験。(複数同時接続してる状態にはしない)
※コネクションプールはconnector-pythonの機能利用
つかっているプログラムは こちら
条件
ローカルのMySQLに対して、特定条件でアクセスして速度を測定する。
条件は下記。
- 1o秒間何もしない(平常時の負荷確認用)
- 接続切断だけを5000回実行する。
- SQL1つを5000回実行する。(都度接続)
- SQL1つを5000回実行する@コネクションプール使用。(接続自体は1回)
※SQL1つ実行毎にリクエスト1回分と見立てるとして(都度、プール共に)
計測内容
- 実行時間(s)
- 実行時間/5000回(ms)
- CPU負荷(%)
結果
10秒間何もしない(平常時の負荷確認用)
実行時間(s): 10.03, 実行時間/5000(ms): - ※, cpu_average: 7.4%
※何もしないで10秒立つのを待ってるだkで、ここでは無意味な数値なので値無し。
接続切断だけを5000回実行する。
実行時間(s): 13.06, 実行時間/5000(ms): 2.6112, cpu_average: 40.1%
SQL1つを5000回実行する。(都度接続)
実行時間(s): 14.98, 実行時間/5000(ms): 2.9962, cpu_average: 44.7%
SQL1つを5000回実行する@コネクションプール使用。(接続自体は1回)
実行時間(s): 5.46, 実行時間/5000(ms): 1.0926, cpu_average: 42.7%
総評
5000回の接続&切断(プール時はプール取得&返却)の1回をリクエスト1回分のDB接続コストって考えると、1リクエストでプール有り無しでの差は 2ms しかないことになる。
影響が大きいと見るか小さい見るかは案件次第。構成かえると結果が変わる可能性もあるけど、2ms だったらプール無くてもいいかな、、っていう感じしますね。。
備考
Auroraも一緒だと思うけどいつかやりたい。