ApsaraDB for MongoDB を使用すると、CPU使用率が高くなり、100% に近づく可能性があります。 CPU 使用率が高いと、読み書き操作が遅くなり、通常のビジネス操作に影響します。 このトピックでは、高 CPU 使用率のトラブルシューティング方法について説明します。
実行中のリクエストを分析する
mongo shell を使用して ApsaraDB for MongoDB インスタンスに接続します。
接続方法はインスタンスアーキテクチャによって異なります。 詳細については、次のトピックを参照できます。
db.currentOp()コマンドを実行して、インスタンスの実行中の操作をチェックします。出力例:
{ "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() コマンドを実行して、実行中の操作を確認し、インスタンスが時間のかかるリクエストを処理しているかどうかを分析できます。 日常業務の CPU 使用率は高くありません。 ただし、O&M エンジニアがインスタンスにログオンしてコレクションスキャンを必要とする特定の操作を実行すると、CPU 使用率が大幅に増加し、インスタンスのパフォーマンスが低下します。 この場合、時間のかかる操作を確認する必要があります。
異常なリクエストが見つかった場合は、このリクエストの操作ID (opid) を取得し、db.killOp(opid) コマンドを実行してこのリクエストを終了します。
db.killOp() コマンドの詳細については、「db.killOp() 」をご参照ください。
インスタンスでの低速リクエストの分析
アプリケーションの実行開始後、インスタンスの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" }
低速クエリログの場合は、次の項目に細心の注意を払う必要があります。
コレクションスキャン (キーワード:
COLLSCANanddocsExamined)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リソースがまだ完全に占有されている場合、インスタンスは最大機能に達している可能性があります。 この場合、次の方法を使用して問題に対処することを推奨します。
モニタリング情報を表示して、インスタンスのリソース使用量を分析します。 詳細については、「モニタリングデータの表示」および「基本モニタリング」をご参照ください。
現在のインスタンスがビジネスシナリオのパフォーマンスと機能の要件を満たしているかどうかを確認します。
インスタンスをアップグレードする方法については、「概要」または「レプリカセットインスタンスの設定の変更」をご参照ください。