ApsaraDB for MongoDBを使用すると、CPU使用率が過度に高くなるか、100% に近づく可能性があります。 CPU使用率が高いと、読み取りおよび書き込み操作が遅くなり、通常のビジネス操作に影響します。 このトピックでは、アプリケーションのApsaraDB for MongoDBの高CPU使用率のトラブルシューティング方法について説明します。
ApsaraDB for MongoDBデータベースで実行中のリクエストを分析する
mongo shellを使用してApsaraDB for MongoDBインスタンスに接続します。
接続方法はインスタンスアーキテクチャによって異なります。 詳細については、次のトピックを参照できます。
db.currentOp()
コマンドを実行して、ApsaraDB for MongoDBデータベースで実行中の操作を確認します。次のコードは、コマンド出力の例を示しています。
{ "desc" : "conn632530", "threadId" : "140298196924160", "connectionId" : 632530, "client" : "11.192.159.236:57052", "active" : true, "opid" : 1008837885, "secs_running" : 0, "microsecs_running" : NumberLong(70), "op" : "update", "ns" : "mygame.players", "query" : { "uid" : NumberLong(31577677) }, "numYields" : 0, "locks" : { "Global" : "w", "Database" : "w", "Collection" : "w" }, .... }
次の表に、細心の注意を払う必要があるフィールドを示します。
パラメーター
説明
クライアント
リクエストを送信したクライアント。
opid
操作の一意のID。
必要に応じて、
db.killOp(opid)
コマンドを実行して操作を終了します。secs_running
操作が実行されている期間。 単位は秒です。
このフィールドに比較的大きな値が返された場合は、リクエストが適切かどうかを確認します。
microsecs_running
操作が実行されている期間。 単位:マイクロ秒。
このフィールドに比較的大きな値が返された場合は、リクエストが適切かどうかを確認します。
ns
操作がスキャンを実行するコレクション。
op
操作タイプです。 ほとんどの場合、この値はクエリ、挿入、更新、または削除です。
ロック
ロック関連情報。 詳細については、「FAQ: Concurrency」をご参照ください。
説明db.currentOp()
コマンドの詳細については、「db.currentOp() 」をご参照ください。
db.currentOp()
コマンドを実行して、実行中の操作を確認し、ApsaraDB for MongoDBが時間のかかるリクエストを処理しているかどうかを分析できます。 たとえば、日常業務のCPU使用率は高くありません。 ただし、O&MエンジニアがApsaraDB for MongoDBデータベースにログオンしてコレクションスキャンを必要とする特定の操作を実行すると、CPU使用率が大幅に増加し、ApsaraDB for MongoDBが低迷します。 この場合、時間のかかる操作を確認する必要があります。
異常なリクエストが見つかった場合は、このリクエストの操作ID (opid
) を取得し、db.killOp(opid)
コマンドを実行してこのリクエストを終了します。
db.killOp()
コマンドの詳細については、「db.killOp() 」をご参照ください。
ApsaraDB for MongoDBデータベースでの低速リクエストの分析
アプリケーションの実行開始後、ApsaraDB for MongoDBインスタンスのCPU使用率がすぐに上昇し、高いままであり、db.currentOp()
コマンドの出力に異常なリクエストが見つからない場合、インスタンスデータベースの低速リクエストを分析できます。
ApsaraDB for MongoDBコンソールでインスタンスの低速クエリログを表示します。 詳細については、「低速クエリログの表示」をご参照ください。
低速クエリログを分析して、インスタンスのCPU使用率が高いことをトラブルシューティングします。
次の例は、低速クエリログを示しています。
{ "atype": "slowOp" 、 "param": { "op": "query" 、 "ns": "abbott_analysis.uaidScanInfo" 、 "query": { "find": "uaidScanInfo" 、 "filter": { "dateType": 2、 "companyCode": "GMP" }, "ntoreturn": -1、 "sort": { "scanDateTime": -1 } }, "keysExamined": 0、 "docsExamined": 2181021、 "hasSortStage": true、 "cursorExhausted": true、 "numYield": 17059、 "locks": { "グローバル": { "acquireCount": { "r": { "$numberLong": "34120" } }, "acquireWaitCount": { "r": { "$numberLong": "7" } }, "timeAcquiringMicros": { "r": { "$numberLong": "3152" } } }, "Database": { "acquireCount": { "r": { "$numberLong": "17060" } } }, "コレクション": { "acquireCount": { "r": { "$numberLong": "17060" } } } }, "nreturned": 0、 "responseLength": 20、 "millis": 4878、 "planSummary": "COLLSCAN" }, "result": "OK" }
低速クエリログの場合は、次の項目に細心の注意を払う必要があります。
コレクションスキャン (キーワード:
COLLSCAN
anddocsExamined
)COLLSCAN
はコレクションスキャンを示します。要求のコレクションスキャン (クエリ、更新、または削除操作など) は、CPU使用率が高くなる可能性があります。 スロークエリログで
COLLSCAN
キーワードが見つかった場合、CPUリソースがこれらの要求によって占有されている可能性があります。説明このようなリクエストが頻繁に送信される場合は、クエリのパフォーマンスを最適化するために、クエリされたフィールドにインデックスを作成することを推奨します。
docsExamined
フィールドは、ApsaraDB for MongoDBがリクエストに対してスキャンしたドキュメントの数を示します。 フィールド値が大きいほど、このリクエストが占有するCPUリソースが多くなります。
不適切なインデックス (キーワード:
IXSCAN
およびkeysExamined
)説明インデックスが多すぎると、書き込みと更新のパフォーマンスに影響します。
アプリケーションに多数の書き込み操作が含まれ、インデックスを使用すると、アプリケーションのパフォーマンスが影響を受ける可能性があります。
keysExamined
フィールドは、インデックスを使用するリクエストに対してApsaraDB for MongoDBがスキャンしたインデックスキーの数を示します。 フィールド値が大きいほど、このリクエストが占有するCPUリソースが多くなります。不適切なインデックスや大量のデータと一致するインデックスを作成した場合、インデックスはCPUオーバーヘッドを削減したり、リクエストの実行を高速化したりできません。
たとえば、コレクション内のデータの場合、x フィールドは 1 または 2 にのみ設定され、y フィールドはより広い値範囲に設定されているとします。
{ x: 1, y: 1} {x: 1, y: 2} {x: 1, y: 3} ...... {x: 1, y: 100000} {x: 2, y: 1} {x: 2, y: 2} {x: 2, y: 3} ...... {x: 1, y: 100000}
データ {x: 1, y: 2} を照会するには、インデックスを作成します。
db.createIndex( {x: 1} ) // 大量のデータはxフィールドと同じ値を持つため、このインデックスは不適切です。 db.createIndex( {x: 1, y: 1} ) // 大量のデータはxフィールドと同じ値を持つため、このインデックスは不適切です。 db.createIndex( {y: 1 } ) // 少量のデータはyフィールドと同じ値を持つため、このインデックスは適切です。 db.createIndex( {y: 1, x: 1 } ) // 少量のデータはyフィールドと同じ値を持つため、このインデックスは適切です。
説明インデックス {y: 1} と {y: 1, x: 1} の違いについては、「MongoDBインデックスの設計原理」および「複合インデックス」をご参照ください。
大量のデータのソート (キーワード:
SORT
およびhasSortStage
)クエリにソート順序が含まれている場合、
hasSortStage
フィールドの値はtrue
です。 クエリがインデックスを使用して要求されたソート結果を順番に返すことができない場合、ApsaraDB for MongoDBはクエリ結果をソートする必要があります。 ソート操作は、高いCPU使用率を引き起こす可能性がある。 この問題に対応して、頻繁にソートされるフィールドにインデックスを作成して、ソートパフォーマンスを最適化できます。説明スロークエリログに
SORT
キーワードがある場合は、インデックスを使用して並べ替えのパフォーマンスを最適化できます。
インデックスの作成や集計
(トラバース、クエリ、更新、ソートの組み合わせ) などの他の操作も、CPUの使用率が高くなる可能性があります。 上記のトラブルシューティング方法を使用することもできます。
サービス機能の評価
ApsaraDB for MongoDBデータベースで実行中のリクエストとスローリクエストを分析して最適化すると、すべてのリクエストが適切になり、インデックスが効率的に使用されます。 CPUリソースがまだ完全に占有されている場合、インスタンスは最大機能に達している可能性があります。 この場合、次の方法を使用して問題に対処することを推奨します。
モニタリング情報を表示して、インスタンスのリソース使用量を分析します。 詳細については、「モニタリングデータの表示」および「基本モニタリング」をご参照ください。
現在のインスタンスがビジネスシナリオのパフォーマンスと機能の要件を満たしているかどうかを確認します。
インスタンスをアップグレードする方法については、「概要」または「レプリカセットインスタンスの設定の変更」をご参照ください。