Open2

適切な最大コネクション値とはどのくらいなのか?

ふじしろふじしろ

ソースを元に説明してくれている記事
https://qiita.com/ryo511/items/0f941e219f94dd7e0657

そのソース(HikariCP)
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing

内容的には最大コネクション数というよりもプールサイズについて、という感じ。
記事では最大コネクション数 = プールサイズとして扱ってたけど、ここらへんは読み替える必要があるかも。式とかはこちらのソースの記述をみるとプールサイズと明記してある。

Bingで要約

このページの内容を要約すると、以下のようになります。

  • コネクションプールのサイズは、データベースの性能に大きな影響を与える。
  • コネクションプールのサイズは、CPUコア数、ディスク性能、ネットワーク帯域などの要因に応じて調整する必要がある。
  • コネクションプールのサイズを大きくしすぎると、コンテキストスイッチングやリソース競合のオーバーヘッドが増えて、性能が低下する。
  • コネクションプールのサイズを小さくしすぎると、I/O待ちやネットワーク遅延などでブロックされたスレッドが多くなり、性能が低下する。
  • コネクションプールのサイズを決めるための一般的な公式は、((core_count * 2) + effective_spindle_count)である。
  • コネクションプールのサイズは、負荷テストや監視ツールを使って最適化することが推奨される。
ふじしろふじしろ

AWSで最大接続数のベストプラクティスに言及している箇所があった。
https://repost.aws/ja/knowledge-center/rds-mysql-max-connections

max_connections パラメータを設定するためのベストプラクティスに従う
DB インスタンスに max_connections パラメータを使用するときは、次のベストプラクティス考慮するようにしてください。

  • デフォルトの接続制限は、その他の主要なメモリコンシューマー (バッファプールなど) のデフォルト値を使用するシステム用に調整されています。インスタンスクラスの値を変更するのではなく、インスタンスクラスをスケールアップするのがベストプラクティスです。ただし、インスタンスに大量の空きメモリがある場合は、このパラメータをマニュアルで変更できます。DB インスタンス用にこれらの設定を変更する前に、DB インスタンスでの使用可能なメモリの増減を考慮して接続制限を調整することを検討してください。
  • max_connections 値は、各 DB インスタンスで開かれることが想定される接続の最大数よりもわずかに大きい値に設定します。
  • RDS for MySQL インスタンスでパフォーマンススキーマをアクティブ化した場合は、max_connections パラメータ設定に細心の注意を払ってください。パフォーマンススキーマのメモリ構造のサイズは、サーバー設定変数に基づいて自動的に決定されます。変数に大きな値を設定するほど、パフォーマンススキーマが使用するメモリも増加します。極端なケースでは、この条件が T2 および T3 などのスモールインスタンスタイプでのメモリ不足の問題を引き起こす場合があります。パフォーマンススキーマを使用している場合は、max_connections の設定をデフォルト値のままにしておくことがベストプラクティスです。max_connections の値を (デフォルト値よりも大きく) 大幅に大きくする予定の場合は、パフォーマンススキーマの無効化を検討してください。
    注: Amazon RDS for MySQL DB インスタンスの Performance Insights をアクティブ化すると、パフォーマンススキーマが自動的にアクティブ化されます。
  • RDS for MySQL インスタンスで max_connections パラメータを調整するときは、次の MySQL 接続関連のパラメータを確認してください:
    • wait_timeout: 接続を閉じる前に、サーバーが非インタラクティブ TCP/IP または Unix ファイル接続でのアクティビティのために待機する秒数
    • interactive_timeout: 接続を閉じる前に、サーバーがインタラクティブな接続でのアクティビティのために待機する秒数。
    • net_read_timeout: 読み取りアクティビティをドロップする前に TCP/IP 接続からのより多くのデータを待機する秒数。
    • net_write_timeout: 書き込みアクティビティをドロップする前に、ブロックが書き込まれるのを TCP/IP 接続で待機する秒数。
    • max_execution_time: ミリ秒単位での SELECT ステートメントの実行タイムアウト
    • max_connect_errors: 中断された接続の数がこの値を超える場合、ホストがそれ以降の接続からブロックされます
    • max_user_connections: 任意の MySQL アカウントに許可される同時接続の最大数
  • RDS for PostgreSQL インスタンスで max_connections パラメータを調整するときは、次の PostgreSQL 接続関連のパラメータも必ず確認してください:
    • idle_in_transaction_session_timeout: 指定された時間 (ミリ秒) よりも長くアイドル状態になっているオープントランザクションを持つセッションを終了します。これにより、そのセッションによって保持されていたロックが解放され、接続スロットが再利用可能になります。また、このトランザクションでのみ表示されるタプルはバキュームされます。
    • tcp_keepalives_idle: オペレーティングシステムが TCP キープアライブメッセージをクライアントに送信するまで非アクティブ状態となる秒数
    • tcp_keepalives_interval: クライアントが確認していない TCP キープアライブメッセージが再度送信されるまでの秒数
    • tcp_keepalives_count: サーバーとクライアントとの接続が停止しているとみなされる前に失われる可能性のある TCP キープアライブの数。