Amazon DocumentDB (MongoDB 互換) クラスターでクエリの実行速度が遅い問題のトラブルシューティングを行い、パフォーマンスを向上させたいと思っています。
解決策
以下の理由により、Amazon DocumentDB クラスターでのクエリの実行速度が遅くなることがあります。
- ハードウェアのサイズが小さい
- ワークロードの変化
- トラフィックの増加
- メモリの問題
- 最適とは言えないクエリプラン
ワークロードを監視する
データベースパフォーマンスの問題の根本原因を理解するには、インスタンスが使用しているサーバー全体のリソースをすべて確認します。ワークロードを監視し、いつクエリのパフォーマンスが最適だったか、いつクエリの実行に時間がかかり始めたかを調査します。
Amazon CloudWatch メトリクスを使用する
Amazon DocumentDB の CloudWatch メトリクスを使用して、クラスターのパフォーマンスを分析します。リソース不足によるパフォーマンスのボトルネックを特定するには、CPUUtilization や FreeableMemory などのメトリクスを使用します。メモリの最適化を理解するには、BufferCacheHitRatio や LowMemNumOperationsThrottled などのメトリクスを使用します。
運用レベルのメトリクスを監視して、インスタンスのワークロードを把握します。有用なメトリクスは、DocumentsInserted、DocumentsReturned、DocumentsDeleted、TransactionsAborted などです。詳細については、「Monitoring metrics and setting up alarms on your Amazon DocumentDB (with MongoDB compatibility) clusters」(Amazon DocumentDB (MongoDB 互換) クラスターでのメトリクスの監視とアラームの設定) を参照してください。
Performance Insights を使用する
Performance Insights を使用すると、待機数、クエリ、ホスト、データベース、およびアプリケーションごとに分類されたデータベースワークロードを評価できます。カウンターと詳細なクエリ情報を収集し、どのクエリがデータベース負荷に最も寄与しているかを評価します。Max vCPU 値よりも高いデータベース負荷は、インスタンスクラスのワークロードが調整されていることを示します。クエリのテキストを分析して、クエリの調整に役立ててください。
プロファイラーログを使用する
Amazon DocumentDB プロファイラーを使用して、クラスターで実行された操作の実行時間と詳細を記録します。プロファイラーを使用すると、クラスターで最も遅い操作を監視できます。これにより、個々のクエリのパフォーマンスとクラスター全体のパフォーマンスを向上させることができます。
データベースメソッドを使用する
Amazon DocumentDB インスタンスで次の currentOp() コマンドを定期的に実行して、システムの使用状況を経時的に監視します。
db.adminCommand({currentOp: 1, $all: 1});
システム内の各名前空間のクエリと操作の数をカウントするには、次のコマンドを実行します。
db.adminCommand({
aggregate: 1,
pipeline: [
{
$currentOp: {
allUsers: true,
idleConnections: true
}
},
{
$group: {
_id: {
desc: "$desc",
ns: "$ns",
WaitState: "$WaitState"
},
count: {
$sum: 1
}
}
}
],
cursor: {}
});
コマンドを実行したら、システムの使用結果を分析してシステムの負荷を把握し、適切なアクションを実行します。
クエリを最適化する
実行時間の長いクエリを特定したら、クエリを調整してクエリのパフォーマンスを向上させます。
適切なクエリプランナーを使用する
パフォーマンスを向上させるには、最適なインデックスプランを使用し、オペレーターのインデックススキャンサポートを有効にします。Amazon DocumentDB バージョン 5.0 以降では、プランナーバージョン 2.0 を使用して、検索、更新、削除、検索と変更のコマンドなどの基本的な操作を最適化する高度なクエリプランナーを活用してください。これにより、最適なインデックスが選択されない特定のクエリパターンで、特定のクエリ形状のインデックスのリストを指定できるプランキャッシュフィルター機能のサポートが追加されます。
クエリの統計情報を分析する
クエリのパフォーマンスを最適化するには、executionStats を使用してクエリの実行状況を分析します。executionStats は、各クエリステージで処理されたドキュメント数、各ステージの実行時間、クエリプランの生成を試みた回数を示します。
クエリの統計情報を表示するには、次のコマンドを実行します。
query.explain("executionStats");
操作例:
db.collection.find({}).limit(2).explain("executionStats");
前の操作例では、2 つのドキュメントを検索しようとしたときのクエリの実行状況を分析しています。
返された統計情報を確認します。インデックスを追加すると、コレクション全体のスキャン回数を減らし、クエリでスキャンする必要があるドキュメントの数を制限できます。新しいインデックスをテストしてパフォーマンスを評価するのがベストプラクティスです。クローン作成またはスナップショット復元オプションを使用して、テスト環境を作成します。
インスタンスに非効率なインデックスがないか確認する
インデックスごとに、追加の書き込みレイテンシー、CPU 使用率、I/O オペレーション、およびリソース上の全体的なストレージ使用量が増加します。インデックスはクエリのパフォーマンスを向上させることができますが、定期的にインデックスを確認し、未使用のインデックスを削除することをお勧めします。
各インデックスへのアクセス頻度の内訳を確認するには、次の例のようなコマンドを実行します。
db.collection.aggregate([{$indexStats:{}}]).pretty()
インデックスで実行されたスキャン (インデックススキャン) の合計数を表示するには、次のコマンドを実行します。
db.collection.stats()
前のクエリのカウントを、インデックスなしで実行されたスキャン (コレクションスキャン) の数と比較します。次に、オペレーションがコレクションにアクセスするときにインデックスを使用する頻度を分析します。
インスタンス上の非アクティブなカーソルを閉じる
Amazon DocumentDB インスタンスでは、一度に開くことができるアクティブカーソルに制限があります。使用するインスタンスタイプによってこの制限が決まります。詳細については、「Instance limits」(インスタンス制限) を参照してください。CloudWatch を使用して CloudWatch の DatabaseCursors メトリクスを監視し、開いているカーソルの数を確認します。
開いているカーソルの詳細を表示するには、次の例のようなコマンドを実行します。
db.runCommand("listCursors")
スロットリングを避けるため、使用後はカーソルを閉じることをお勧めします。アイドルカーソルは CPU とメモリを利用して、関連するキューを監視します。
関連情報
Troubleshooting performance and resource utilization (パフォーマンスとリソース使用率のトラブルシューティング)