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