データベースプロファイラ

based on v18

Mongoには、データベース操作のパフォーマンスを分析するためのプロファイリングツールが含まれています。

currentOp コマンドも参照ください。

プロファイリングの有効化

プロファイリングを有効にするには、 mongo シェルから以下のコマンドを実行してください。

> db.setProfilingLevel(2); 
{"was" : 0 , "ok" : 1} 
> db.getProfilingLevel() 
2 

Profiling level は

  • 0 - off
  • 1 - log slow operations (>100ms)
  • 2 - log all operations

1.3.0 では、 --profile=1 をコマンドラインで指定することでも有効化できます。

見る

プロファイリングされたデータはデータベースの system.profile コレクションに保存されます。このコレクションをクエリーすることで結果を見ることができます。

> db.system.profile.find() 
{"ts" : "Thu Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" : "query test.$cmd ntoreturn:1 reslen:66 nscanned:0 <br>query: { profile: 2 } nreturned:1 bytes:50" , "millis" : 0} 
... 

$cmd (command) の操作を含まない出力を見るには、

db.system.profile.find( function() { return this.info.indexOf('$cmd')<0; } ) 

特定のコレクションに対する操作を見るには、

> db.system.profile.find( { info: /test.foo/ } ) 
{"ts" : "Thu Jan 29 2009 15:19:40 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0} 
{"ts" : "Thu Jan 29 2009 15:19:42 GMT-0500 (EST)" , "info" : "insert test.foo" , "millis" : 0} 
{"ts" : "Thu Jan 29 2009 15:19:45 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:102 nscanned:2 <br>query: {} nreturned:2 bytes:86" , "millis" : 0} 
{"ts" : "Thu Jan 29 2009 15:21:17 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 reslen:36 nscanned:2 <br>query: { $not: { x: 2 } } nreturned:0 bytes:20" , "millis" : 0} 
{"ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 exception bytes:53" , "millis" : 88} 

指定したミリ秒より遅い操作を見るには、

> db.system.profile.find( { millis : { $gt : 5 } } ) 
{"ts" : "Thu Jan 29 2009 15:21:27 GMT-0500 (EST)" , "info" : "query test.foo ntoreturn:0 exception bytes:53" , "millis" : 88} 

新しい情報を最初に出すには、

db.system.profile.find().sort({$natural:-1}) 

mongoシェルには、1ms以上かかった最近5つの結果を表示するヘルパーがあります。  コマンドプロンプトから show profile とタイプしします。

出力結果を理解する

出力結果は次の値をレポートします。

  • ts 発生したTimestamp
  • millis 実行にかかった時間(ミリ秒)
  • info 詳細
    • query クエリー操作。このフィールドはいくつかの追加情報を含みます。
      • ntoreturn クライアントのクエリーが要求した結果のオブジェクト数。例: <code>findOne()</code> はでは、 ntoreturn は 1 がセットされます。 <code>limit()</code> では、limitをセットします。0は制限なしのことです。
      • query クエリーの詳細
      • nscanned この操作によりいくつのオブジェクトがscanされたか
      • reslen クエリの結果のバイト数
      • nreturned クエリによって返されたオブジェクトの数。
    • update データベースの更新操作。 <code>save()</code> が、updateまたはinsertが起こったとき。
      • fastmod 速い更新操作が行われたことを示します。 Updates を参照。 これらの操作は通常とても速いです。
      • fastmodinsert - upsert を実行した速い操作が実行されたことを示します。
      • upsert upsert の実行されたことを示します。
      • moved updateされたオブジェクトがディスク上で移動されたことを示します(in placeアップデートでない)。これは in place アップデートより遅いです。通常オブジェクトが大きくなった場合に起こります。
    • insert データベースinsert。
    • getmore 巨大なqueryで、データベースが部分的な結果を最初返したことを示します。 getmore はさらなら情報を取得するための呼び出しを示します。

クエリーパファーマンスの最適化

  • nscannednreturned よりかなり多い場合、データベースは目的のオブジェクトを見つけるたまに、多くのオブジェクトをscanしているこになります。indexを作成することを考えてください。
  • reslen 大きいサイズ(数百キロバイト以上)を返すことは遅いパフォーマンスの原因になります。<code>find()</code> の2個目のパラメータに取得したいフィールド(member)の名前だけ書くことを考えてください。

注意: インデックスを作ることはコストになります。インデックスは、コレクションをinsertやupdateする度にディスク書き込みをすることの原因になります。たまにしか実行しないクエリーの場合、クエリーを"遅い"ままにして、インデックスを作らない方がよい場合もあります。クエリが書き込みと比べ多いコレクションには、インデックスをつけたほうがいいでしょう。

updateパフォーマンスの最適化

  • nscanned を見てください。 もしこれがとても大きな値の場合、データベースは更新のためにとても多くのオブジェクトをscanしていることになります。このupdateが頻繁に起こる操作の場合indexを作成することを検討してください。
  • fast modify 操作をできる限り使ってください(通常、インデックスと一緒に)。 Updates を参照してください。

プロファイラのパフォーマンス

プロファイラを有効化してある場合、それほどひどくありませんが、パフォーマンスに悪影響を与えます。

プロファイルのデータは、制限付きコレクション なデータベースコレクションに保存されます。 デフォルトでは、最近のいくつかの操作だけが入るような小さなサイズがセットされています。

"遅い(slow)"の定義

1.3.0 から、二つの方法で "遅い(slow)"を定義できます。

  • mongod起動時(または設定ファイルで)、--slowms で指定します。
  • db.setProfilingLevel( level , slowms )
     
    db.setProfilingLevel( 1 , 10 ); 
    

    この例では、10ms 以上のクエリのログがすべてsystem.profileに行きます。

参照


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.

These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.

blog comments powered by Disqus