接続ストームは多くの場合、接続数の急増として表示され、データベースのパフォーマンスの問題として誤って診断されることが多いです。
このページでは、接続ストームと"too many connections" エラーの一般的な原因と解決策について説明します。以下のセクションを行った後に追加のサポートが必要な場合は、テクニカル サポートにお問い合わせください。
前提条件チェック
配置で接続ストームや接続制限の問題が発生しているかどうかを確認するには、serverStatus コマンドを実行し、次のインジケーターを確認します。
での急増
connections.currentでの急増
connections.active
また、配置のログメッセージで、急増する "Connection accepted"connectionCount属性を持つ多数の メッセージや、低速クエリログエントリの増加を確認することもできます。
Atlas 配置では、Atlas UIでクラスターに移動し、Metrics、次に Connections を選択して、一定期間の接続数グラフを表示できます。
一般的な問題と解決策
次のセクションでは、接続ストームの一般的な原因とその解決方法について説明します。
接続プールの設定が誤っていた
をminPoolSize maxPoolSizeより大幅に低く設定すると、ドライバーは少数のアイドル接続のみを維持します。重いワークロードがある場合、または再起動後に、ドライバーは作業プールのサイズに達するために多くの新しい接続を素早く開く必要があるため、新しい接続の数が急増する可能性があります。
高サーバーまたはクエリ レイテンシ
サーバーまたはクエリのレイテンシが増加すると、個々の接続がアクティブな状態のままになります。これにより、ドライバーは受信リクエストを処理するために追加の接続を開く必要があり、合計接続数が増加します。
connections.active の値が高く、クエリレイテンシが高くなっている場合は、 ドライバー接続文字列で minPoolSize を maxPoolSize に近い値に設定します。これにより接続プールが事前にウォームアップされ、負荷下で新しい接続を多数開く必要がなくなります。
操作負荷の増加
アプリケーショントラフィックが急増すると、利用可能な接続プールが枯渇し、ドライバーは新しい接続を迅速に開く必要があります。
トラフィックの増加に関連して接続スパイクが発生していることに気付いた場合は、 ドライバー接続文字列で minPoolSize を maxPoolSize に近い値に設定することを検討してください。これにより、ドライバーは事前に確立された接続を十分に維持し、新しい接続をすばやく開く必要なく、トラフィックの急増に対応できるようにします。
一時的なネットワーク イベントまたはアプリケーションの再起動
ネットワークの停止、ローリング再起動、またはアプリケーション層の突然のスケーリング イベントにより、アプリケーションインスタンスが同時に再接続され、新しい接続リクエストでサーバーが満杯にする可能性があります。
配置イベントやネットワークの中断中に接続スパイクが発生した場合は、各アプリケーションインスタンスが開始できる接続の合計数を制限するために、maxPoolSize を設定することを検討してください。これにより、同時再接続イベントの影響が軽減されます。
リクエストごとの MongoClient 作成
MongoClient単一の 共有インスタンスを再利用するのではなく、すべてのリクエストまたは関数の呼び出しに新しい を作成すると、各クライアントは構成されたmaxPoolSize まで独自の接続プールを開くことができます。多数の同時リクエストや短時間の実行環境では、オープン接続の総数が乗じられ、接続ストームがトリガーされる可能性があります。
リクエスト量と相関して接続数が徐々に増加していることに気付いた場合は、アプリケーションがリクエストごとに新しい MongoClient をインスタンス化するかどうかを確認し、すべての操作にわたって MongoClient を単一の共有インスタンスとして実装することを検討してください。これにより接続の使用が安定し、プールの乗算による接続数の急増を防ぎます。
シャーディングされたクラスターで誤ったルーター プールの設定
シャーディングされたクラスターでは、各mongos ルーターが各シャードで接続プールを維持します。これらのプールのサイズが正しく設定されていない場合、ルーターが同時に多数の内部接続を開くと、アプリケーション層の接続ストームがシャード層に伝播する可能性があります。
接続ストームがmongos プロセスから発生していることに気付いた場合は、次のことを検討してください。
taskExecutorパラメータを設定して、各 ルーター上のtaskExecutorPoolSize接続プールの数を制限します。各 ルーター プール内の接続の最小数と最大数を制御するには、 パラメータと
ShardingTaskExecutorPoolMinSizeShardingTaskExecutorPoolMaxSizeパラメータを使用します。
過プロビジョニングされたMongoDB Atlasクラスター
各MongoDB Atlasクラスター層は、ノードごとに最大数の同時着信接続数を強制します。アプリケーションが階層で許可される以上の接続を開くと、クラスターは次のエラーを表示して新しい接続リクエストを拒否することがあります。
connection refused because too many open connections
connections.current負荷が増加すると接続拒否が発生し、プール設定を調整しても改善しない場合は、 がクラスター層の制限に達しているかどうかを確認してください。クラスター層ごとの接続制限を表示するには、「 Atlas サービスの制限 」を参照してください。
接続数がクラスター層の制限に達しているかそれに近い場合は、ノードごとの接続制限を増やすために、より高いクラスター層にアップグレードすることを検討してください。クラスターを増やすには、「 クラスターの変更 」を参照してください。
解決策を確認する
接続ストームが解決されたことを確認する方法は、次のとおりです。
serverStatusconnections.currentconnections.availableを再実行し、 が に対して期待どおりのレベルに戻ったことを確認します。Atlas 配置で、Atlas Metrics ビューの接続数グラフがベースラインに戻っていることを確認します。
より多くのサポートのために収集する診断情報
問題が解決されない場合は、テクニカル サポート にお問い合わせください。サポートに連絡する前に、次の情報を収集してください。