MongoDB パフォーマンス
項目一覧
MongoDB を使用してアプリケーションを開発および運用する際には、アプリケーションとそのデータベースのパフォーマンスを分析する必要がある場合があります。パフォーマンスの低下が起きる場合は、しばしばデータベースアクセスに関する戦略、ハードウェアの可用性、およびオープンなデータベース接続の数が関係しています。
一部のユーザーは、インデックス戦略が不十分または不適切であるため、またはスキーマ設計パターンが不十分なため、パフォーマンスの制限を経験する場合があります。 ロック パフォーマンスでは、これらが MongoDB の内部ロックにどのように影響するかについて説明します。
パフォーマンスの問題は、データベースが容量いっぱいまで動作しており、データベースに追加の容量を追加する時期が来ていることを示している場合があります。特にアプリケーションのワーキングセットは、利用可能な物理メモリーに収める必要があります。
場合によっては、パフォーマンスの問題は一時的なもので、通常とは異なるトラフィックの負荷に関連していることもあります。「接続数」の解説にもあったとおり、スケーリングは過剰なトラフィックを緩和するのに役立ちます。
データベースのプロファイリングは、パフォーマンス低下の原因となっている操作を把握するのに役立ちます。
ロック パフォーマンス
MongoDB は、データ セットの一貫性を確保するためにロック システムを使用します。特定の操作が長時間実行されたり、キューが形成されたりすると、リクエストと操作がロックを待機するため、パフォーマンスが低下します。
ロック関連のスローダウンは断続的に起こることがあります。 ロックがパフォーマンスに影響を与えているかどうかを確認するには、 locks セクションと 出力の globalLock serverStatus
セクションを参照してください。
注意
MongoDB Atlas M 0 /M 2 /M 5クラスターでは一部のserverStatus
応答フィールドは返されません。 詳細については、MongoDB Atlas ドキュメントの「制限されたコマンド」を参照してください。
locks.<type>.timeAcquiringMicros
を locks.<type>.acquireWaitCount
で割ると、特定のロック モードの平均待機時間を概算できます。
locks.<type>.deadlockCount
ロック取得でデッドロックが発生した回数を指定します。
globalLock.currentQueue.total
が一貫して高い場合、多数のリクエストがロックを待機している可能性があります。これは同時実行の問題がパフォーマンスに影響している可能性を示唆します。
globalLock.totalTime
が uptime
に比べて高い場合は、データベースが長時間ロック状態のままになっています。
クエリ時間が長くなる原因としては、インデックスの使用が効果的でない、スキーマの設計が最適ではない、クエリ構造が不十分、システムアーキテクチャに問題がある、RAM の不足によるディスク読み取りの発生などがあります。
接続数
場合によっては、アプリケーションとデータベース間の接続数によって、サーバーのリクエスト処理能力が限界に達することがあります。serverStatus
ドキュメント内の以下のフィールドからインサイトを得られる場合があります。
connections
これは次の 2 つのフィールドのコンテナです。connections.current
データベース インスタンスに接続されている現在のクライアントの合計数。connections.available
新しいクライアントで利用できる未使用の接続の合計数。
アプリケーションによる多数の同時要求がある場合は、データベースが要求に対応できなくなる可能性があります。その場合は配置のキャパシティーを増やします。
書き込みが多いアプリケーションの場合は、 シャーディングを導入し、シャードクラスタ に 1 つ以上の mongod
シャード を追加して、インスタンス間で負荷を分散します。
接続数の急増は、アプリケーションまたはドライバーのエラーによっても発生する可能性があります。公式にサポートされているすべての MongoDB ドライバーは、クライアントが接続をより効率的に利用・再利用できるようにする接続プーリングを実装しています。接続数が極端に多い場合、特にそれに対応するワークロードがない場合は、多くの場合ドライバやその他の設定エラーが原因です。
自己管理型接続制限
システム全体の制限によって制約されない限り、MongoDB でサポートされる着信接続の最大数はmaxIncomingConnections
設定で構成されます。 Unix ベースのシステムでは、 ulimit
コマンドを使用するか、システムの/etc/sysctl
ファイルを編集することで、システム全体の制限を変更できます。 詳細については、「 自己管理型配置の UNIX ulimit
設定」を参照してください。
MongoDB Atlas の接続制限
MongoDB Atlas は、クラスター層と クラスに基づいて同時着信接続数の制限を設定します。 詳細については、Atlas ドキュメントの「接続制限とクラスター階層 」を参照してください。