MongoDB Database Profiling


MongoDB Database Profiling
MongoDB Profilerは、遅いクエリーと操作の識別を支援するデータベース実行アクティビティをキャプチャするシステムです.
 
Profilingレベル
使用可能な取得レベルの意味は次のとおりです.
レベルの設定
0無効
1スロー操作のみ記録可能
2有効化、すべてのアクションの記録
 
Profilingレベルの表示
> db.getProfilingLevel()

 
Profilerの有効化
> db.setProfilingLevel(1)

完全なコマンドは次のとおりです.
db.setProfilingLevel(level,slowms)

レベルが1の場合、スロー操作のデフォルト値は100 msで、500 msとしてスロー操作を指定すると:
> db.setProfilingLevel(1,500)

 
注意:
デフォルトでは、mongodはすべての遅いクエリー(showOpThresholdMsによって定義され、デフォルトは100 ms)をMongoDBログファイルに記録します.
Profilingは、重要な場合にのみ有効にし、本番環境では有効にしないようにします.
独立したmongodインスタンスに基づいてProfilingを有効にします.この設定は、コピーセットまたはスライスクラスタを介して他のインスタンスに拡散しません.
 
Profiler結果の表示
システムを使用しています.記録するprofileはcapped collectionです.あなたのデータベースのシステムです.profileセット、mongo shellコマンドshow profileを呼び出すか、systemをクエリーします.Profileコレクションでは、次のようなProfileの出力を表示できます.
db.system.profile.find( { millis : { $gt : 1000 } } )

クエリー時間が1秒より大きい遅いクエリーを出力できます.
 
Profiler情報内容の詳細
ts-このコマンドはいつ実行されますか.
millis Time-このコマンドの実行にはミリ秒で時間がかかります.
info-このコマンドの詳細.
Query-これがqueryクエリー操作であることを示します.
ntoreturn-今回のクエリクライアントが要求するレコード数.例えばfindOne()コマンド実行時ntoreturnは1.limit(n)条件がある場合ntoreturnはnである.
query-具体的なクエリー条件(x>3など).
nscanned-今回のクエリースキャンのレコード数.
reslen-は結果セットのサイズを返します.
nreturned-今回のクエリで実際に返された結果セット.
update-はupdate更新操作であることを示す.
fastmod-Indicates a fast modify operation. See Updates. These operations are normally quite fast.
fastmodinsert – indicates a fast modify operation that performed an upsert.
upsert-updateのupsertパラメータがtrueであることを示す.このパラメータの機能は、updateのレコードが存在しない場合、updateの条件insertで1つのレコードを記録することである.
moved-は、今回のupdateがハードディスク(HDD)上のデータを移動するかどうかを示す、新規記録が元の記録より短い場合、通常は現在の記録は移動しないが、新規記録が元の記録より長い場合、他の場所に記録が移動する可能性があり、関連インデックスの更新を招く.ディスクの操作が多く、インデックスの更新を加えると、このような操作が遅くなります.
Insert-これはinsert挿入操作です.
getmore-これはgetmore操作であり、getmoreは通常、結果セットの比較的大きなクエリーで発生し、最初のqueryは結果の一部を返し、後続の結果はgetmoreによって取得されます.
 
パフォーマンスの最適化
 
Profilerは有効になっていませんが、本番環境では、ログファイルを表示しても100 ms以上の遅い操作が表示されます.
tail -f /data/var/log/mongodb/mongod.log
Mon May 25 02:57:22.670 [conn756] query MyTest.Pro query: { $query: { CutePath: /^122-133-1456(-\d+)*$/, Avail.Status: { $lt: 5 }, $or: [ { _id: { $lt: 3310 } }, { _id: { $gt: 8520, $lt: 8530 } }, { _id: { $gt: 9720, $lt: 9730 } } ] }, $orderby: { Avail.Status: 1, AvgRate: -1 } } ntoreturn:200 ntoskip:0 nscanned:18764 scanAndOrder:1 keyUpdates:0 numYields: 10 locks(micros) r:217999 nreturned:200 reslen:563505 116ms

nscanned(スキャンされた記録数)がnreturned(結果を返す記録数)よりはるかに大きい場合、インデックスによる記録位置決めの最適化を検討する.
reslenが大きすぎる場合は、返される結果セットが大きすぎることを示します.find関数の2番目のパラメータに必要な属性名のみが書かれているかどうかを確認してください.
インデックスを作成するには、読み取りが少ない場合は、インデックスが多ければ多いほど書き込みが遅くなるため、インデックスを追加しないことをお勧めします.読み取り量が大きい場合は、インデックスを作成するのがお得です.
 
以下を参照してください.
http://docs.mongodb.org/manual/administration/analyzing-mongodb-performance/#database-profiling
http://docs.mongodb.org/master/MongoDB-crud-guide.pdf