Database Profiler
データベースプロファイラーは、実行中の インスタンスに対して実行された mongod
データベースコマンド に関する詳細情報を収集します。これには、CRUD 操作だけでなく、構成コマンドおよび管理コマンドも含まれます。 プロファイラーは、収集したすべてのデータを、プロファイリング済みデータベースそれぞれのsystem.profile
上限付きコレクション である コレクションに書き込みます。プロファイラーによって作成される system.profile
ドキュメントの概要については、「 データベース プロファイラーの出力 」を参照してください。
プロファイラーはデフォルトで off
です。プロファイラーは、複数のプロファイリング レベルのいずれかで、データベースごとまたはインスタンスごとに有効にできます。
プロファイリングを有効にすると、データベースのパフォーマンスとディスク使用量に影響します。 詳細については、「データベースプロファイラのオーバーヘッド」を参照してください。
このドキュメントでは、データベースプロファイラーのいくつかのキー管理オプションについて説明します。 関連する追加情報については、以下を参照してください。
警告
MongoDB サーバーがクラッシュするため、 system.profile
という名前の時系列コレクションまたはビューを作成しないでください。
プロファイリング レベル
次のプロファイリング・レベルを使用できます。
0
- プロファイラーはオフになっており、データは収集されません。これはデフォルトのプロファイラー レベルです。
1
プロファイラーは、
slowms
しきい値を超える操作、または指定されたフィルターに一致する操作のデータを収集します。フィルターが設定されている場合、
slowms
およびsampleRate
オプションはプロファイリングには使用されません。プロファイラーは、フィルターに一致する操作のみをキャプチャします。
2
- プロファイラーは、すべての操作のデータを収集します。
データベース プロファイリングの有効化と構成
mongod
インスタンスのデータベース プロファイリングを有効にできます。
このセクションでは、mongosh
ヘルパーメソッドdb.setProfilingLevel()
を使用してプロファイリングを有効にする方法を説明します。代わりにドライバー メソッドを使用するには、「 ドライバーのドキュメント 」を参照してください。
mongod
インスタンスのプロファイリングを有効にすると、プロファイリング レベルが0より大きい値に設定されます。 プロファイラーはsystem.profile
コレクションにデータを記録します。 MongoDB は、そのデータベースのプロファイリングを有効にすると、そのデータベースにsystem.profile
コレクションを作成します。
プロファイリングを有効にしてプロファイリング レベルを設定するには、プロファイリング レベルをdb.setProfilingLevel()
ヘルパーに渡します。 たとえば、すべてのデータベース操作でプロファイリングを有効にするには、 mongosh
で次の操作を行うことを検討してください。
db.setProfilingLevel(2)
shell は、プロファイリングの前の レベル を示すドキュメントを返します。 "ok" : 1
のキーと値のペアは、操作の成功を示します。
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
新しい設定を確認するには、 「 プロファイリング レベルの確認」セクションを参照してください。
MongoDB 5.0 700} 以降では、 profile
コマンドまたはdb.setProfilingLevel()
ラッパー メソッドを使用してデータベースプロファイラーlevel
、 slowms
、 sampleRate
、またはfilter
に加えられた変更は、 log file
に記録されます。
グローバルおよびデータベースごとのプロファイリング設定
slowms および sampleRate の両プロファイリング設定はグローバルです。これらを設定すると、プロセス内のすべてのデータベースに影響します。
profile
コマンドまたはdb.setProfilingLevel()
shellヘルパー メソッドで設定すると、プロファイリング レベルとフィルター設定はデータベースレベルで設定されます。 コマンドライン オプションまたは構成ファイルオプションのいずれかとして設定すると、プロファイリング レベルとfilter
設定はプロセス全体に影響します。
低速操作のしきい値を指定
デフォルトでは、低速操作のしきい値は 100 ミリ秒です。 低速操作のしきい値を変更するには、次のいずれかの方法で任意のしきい値を指定します。
profile
コマンドまたはdb.setProfilingLevel()
シェルヘルパー メソッドを使用してslowms
の値を設定します。スタートアップ時にコマンドラインから
--slowms
の値を設定します。構成ファイルで
slowOpThresholdMs
の値を設定します。
たとえば、次のコードは、現在のmongod
インスタンスのプロファイリング レベルを1
に設定し、 mongod
インスタンスの低速操作しきい値を 20 ミリ秒に設定します。
db.setProfilingLevel(1, { slowms: 20 })
プロファイリング レベルが1
の場合、しきい値よりも遅い操作をプロファイリングします。
重要
低速操作のしきい値は mongod
インスタンスのすべてのデータベースに適用されます。この値はデータベースプロファイラーと診断ログの両方に使用されるため、パフォーマンスの低下を避けるために、最も有用な値に設定する必要があります。
MongoDB 4.0 以降では、 db.setProfilingLevel()
を使用してmongos
のslowms
とsampleRate
を構成できます。 mongos
の場合、 slowms
とsampleRate
の構成設定は診断ログにのみ影響し、プロファイラーには影響しません。プロファイリングはmongos
では使用できないためです。 [1]
たとえば、次の例では、低速操作のログ記録用にmongos
インスタンスの低速操作しきい値を設定しています。
db.setProfilingLevel(0, { slowms: 20 })
プロファイラー エントリと読み取り操作および書込み (write ) 操作の 診断ログ メッセージ(mongod/mongos ログ メッセージなど)には次のものが含まれます。
replica setのセカンダリ メンバーは、適用に低速操作しきい値よりも長い時間がかかるoplogをログに記録するようになりました。 これらの遅い oplog メッセージ:
ログは、テキスト
applied op: <oplog entry> took <num>ms
を含むREPL
コンポーネントの下にあります。ログレベルに依存しない(システムレベルでもコンポーネントレベルでも)
プロファイル レベルに依存しないでください。
slowOpSampleRate
の影響を受けます。
プロファイラーは遅い oplog エントリをキャプチャしません。
低速操作のランダム サンプルのプロファイリング
バージョン 3.6 の新機能。
すべての低速操作からランダムにサンプリングされたサブセットのみをプロファイリングするには、次のいずれかの方法で、必要なサンプリング レートを指定します。 [2]
profile
コマンドまたはdb.setProfilingLevel()
シェルヘルパー メソッドを使用してsampleRate
の値を設定します。スタートアップ時にコマンドラインから
mongod
の場合は--slowOpSampleRate
の値、mongos
の場合は--slowOpSampleRate
の値を設定します。構成ファイルで
slowOpSampleRate
の値を設定します。
デフォルトでは、 sampleRate
は1.0
に設定されています。つまり、すべての低速操作がプロファイリングされます。 sampleRate
が 0 から 1 の間で設定されている場合、プロファイリング レベルが1
のデータベースは、 sampleRate
に従ってランダムにサンプリングされたパーセンテージのみをプロファイリングします。
たとえば、次のメソッドは、 mongod
のプロファイリング レベルを1
に設定し、プロファイラーがすべての低速操作の 42% をサンプリングするように設定します。
db.setProfilingLevel(1, { sampleRate: 0.42 })
変更されたサンプル レート値はシステム ログにも適用されます。
MongoDB 4.0 以降では、 db.setProfilingLevel()
を使用してmongos
のslowms
とsampleRate
を構成できます。 mongos
の場合、 slowms
とsampleRate
の構成設定は診断ログにのみ影響し、プロファイラーには影響しません。プロファイリングはmongos
では使用できないためです。 [1]
次の例では、低速操作をログに記録するための mongos
インスタンスのサンプリング レートを設定します。
db.setProfilingLevel(0, { sampleRate: 0.42 })
重要
[1] | ( 1 、 2 ) 「データベース プロファイリングとシャーディング」 を参照してください。 |
プロファイルされた操作を決定するためにフィルターを設定する
どの操作をプロファイリングしてログに記録するかは、フィルターの設定で制御できます。プロファイリング フィルターは、次のいずれかの方法で設定できます。
profile
コマンドまたはdb.setProfilingLevel()
シェルヘルパー メソッドを使用してfilter
の値を設定します。
mongod
インスタンスの場合、filter
は診断ログと(有効になっている場合)プロファイラーの両方に影響します。
mongos
インスタンスの場合、filter
は診断ログにのみ影響し、プロファイラーには影響しません。プロファイリングは mongos
では使用できないためです。
注意
プロファイリングの filter
が設定されている場合、slowms および sampleRate オプションは診断ログまたはプロファイラーに影響しません。
たとえば、次のdb.setProfilingLevel()
メソッドはmongod
インスタンスに対して を設定します。
プロファイリングレベル を
2
に設定し、{ op: "query", millis: { $gt: 2000 } }
のフィルター をかけると、プロファイラーは 2 秒以上かかったquery
操作のみをログに記録します。
db.setProfilingLevel( 2, { filter: { op: "query", millis: { $gt: 2000 } } } )
プロファイリング レベルの確認
プロファイリング レベルを表示するには、 mongosh
から次のコマンドを発行します。
db.getProfilingStatus()
shellは、次のようなドキュメントを返します。
{ "was" : 0, "slowms" : 100, "sampleRate" : 1.0, "ok" : 1 }
was
フィールドは、現在のプロファイリング レベルを示します。
slowms
フィールドは、低速とみなされる操作時間のしきい値(ミリ秒単位)を示します。
sampleRate
フィールドは、プロファイリングするべき低速操作の割合を示します。
プロファイリングの無効化
プロファイリングを無効にするには、 mongosh
で次のヘルパーを使用します。
db.setProfilingLevel(0)
mongod
インスタンス全体のプロファイリングを有効にする
テスト環境の開発目的では、 mongod
インスタンス全体に対してデータベースのプロファイリングを有効にできます。 プロファイリング レベルは、 mongod
インスタンスが提供するすべてのデータベースに適用されます。
mongod
インスタンスのプロファイリングを有効にするには、スタートアップ時に次のオプションを mongod
に渡します。
mongod --profile 1 --slowms 15 --slowOpSampleRate 0.5
または、構成ファイルで operationProfiling を指定します。
これにより、プロファイリング レベルが 1
に設定され、15
ミリ秒より長く続く操作が低速と定義され、低速操作の 50% のみをプロファイリングするように指定されます。[2]
slowms
とslowOpSampleRate
は、 logLevel
が0
に設定されている場合に、どの操作が診断ログに記録されるかにも影響します。 slowms
とslowOpSampleRate
は、 mongos
の診断ログの構成にも使用できます。 [2]
データベース プロファイリングとシャーディング
mongos
インスタンスではプロファイリングを有効にできません。シャーディングされたクラスターでプロファイリングを有効にするには、クラスター内の各 mongod
インスタンスのプロファイリングを有効にする必要があります。
ただし、--slowms
と slowOpSampleRate
を mongos
で設定すると、低速操作の診断ログを構成できます。
プロファイラー データを表示
データベースプロファイラーは、データベース操作に関する情報を system.profile
コレクションに記録します。
プロファイリング情報を表示するには、 system.profile
コレクションをクエリします。 クエリの例を表示するには、「プロファイラー データ クエリの例」を参照してください。 出力データの説明については、「データベース プロファイラー出力 」を参照してください。
現在、トランザクション内から system.profile
コレクションに対して任意の操作(読み取りなど)を行うことはできません。
Tip
$comment
を使用してクエリ述語にデータを追加すると、プロファイラーからのデータの分析が容易になります。
プロファイラーのデータ クエリの例
このセクションでは、 system.profile
コレクションへのクエリの例を示します。 クエリ出力の説明については、「データベース プロファイラー出力 」を参照してください。
system.profile
コレクション内の直近 10 件のログ エントリを返すには、次のようなクエリを実行します。
db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
コマンド操作($cmd)を除くすべての操作を返すには、次のようなクエリを実行します。
db.system.profile.find( { op: { $ne : 'command' } } ).pretty()
特定のコレクションの操作を返すには、次のようなクエリを実行します。この例では、 mydb
データベースの test
コレクションの操作を返します。
db.system.profile.find( { ns : 'mydb.test' } ).pretty()
5
ミリ秒より遅い操作を返すには、次のようなクエリを実行します。
db.system.profile.find( { millis : { $gt : 5 } } ).pretty()
特定の時間範囲の情報を返すには、次のようなクエリを実行します。
db.system.profile.find({ ts : { $gt: new ISODate("2012-12-09T03:00:00Z"), $lt: new ISODate("2012-12-09T03:40:00Z") } }).pretty()
次の例では、時間範囲を確認し、読みやすくするために出力の user
フィールドを非表示にして、各操作の実行時間で結果を並べ替えます。
db.system.profile.find({ ts : { $gt: new ISODate("2011-07-12T03:00:00Z"), $lt: new ISODate("2011-07-12T03:40:00Z") } }, { user: 0 }).sort( { millis: -1 } )
最新の 5 つのイベントを表示する
プロファイリングが有効になっているデータベースでは、 mongosh
のshow profile
ヘルパーには、実行に少なくとも1ミリ秒かかった5の最新の操作が表示されます。 次のように、 mongosh
} からshow profile
を発行します。
show profile
プロファイラーのオーバーヘッド
有効にすると、プロファイリングはデータベースのパフォーマンスに影響します。特にプロファイリング レベルが2に設定されている場合、またはプロファイリング レベルが1の低しきい値を使用している場合は、データベースのパフォーマンスに影響します。 プロファイリングは、 system.profile
コレクションと MongoDB logfile
の両方にログを記録するため、ディスク領域も消費します。 プロファイラーを本番環境の配置で設定して有効にする前に、パフォーマンスとセキュリティへの影響を慎重に検討してください。
system.profile
コレクション
system.profile
コレクションは、デフォルト サイズが 1 メガバイトの上限付きコレクションです。このサイズのコレクションには通常、数千のプロファイル ドキュメントを格納できますが、アプリケーションによって、1 回の操作で使用するプロファイリング データの量は増減する場合があります。system.profile
コレクションのサイズを変更する必要がある場合、以下の手順に従ってください。
プライマリの system.profile
コレクションのサイズ変更
プライマリの system.profile
コレクションのサイズを変更する手順は以下の通りです。
プロファイリングを無効にします。
system.profile
コレクションを削除します。新しい
system.profile
コレクションを作成します。プロファイリングを再度有効にします。
たとえば、 4000000
バイト( 4 MB)の新しいsystem.profile
コレクションを作成するには、 mongosh
で次の一連の操作を使用します。
db.setProfilingLevel(0) db.system.profile.drop() db.createCollection( "system.profile", { capped: true, size:4000000 } ) db.setProfilingLevel(1)
セカンダリの system.profile
コレクションのサイズ変更
セカンダリ 上のsystem.profile
コレクションのサイズを変更するには、セカンダリを停止してスタンドアロンとして実行してから、上記の手順を踏む必要があります。 完了したら、そのスタンドアロンをレプリカセットのノードとして再起動します。 詳細は、「自己管理型レプリカセットのノードのメンテナンスの実行 」を参照してください。
[2] | ( 1 、 2 、 3 ) replica setのセカンダリ メンバーは、低速操作のしきい値よりも長い時間がかかるoplogをログに記録するようになりました。 これらの遅い oplog メッセージ:
|