警告
データベースプロファイラーはMongoDB のパフォーマンスを低下させる可能性があります。データベースプロファイラーを有効にする前に、次のいずれかの代替手段を使用することを検討してください。
$queryStats(集計ステージ)
データベースプロファイラーのパフォーマンスへの影響の詳細については、プロファイラーのオーバーヘッドを参照してください。
データベースプロファイラーは、実行中の mongod インスタンスに対して実行されたデータベースコマンドに関する詳細情報を収集します。これには、CRUD 操作だけでなく、構成コマンドおよび管理コマンドも含まれます。
プロファイラーは、収集したすべてのデータを、プロファイリング済みデータベースそれぞれの上限付きコレクションである system.profile コレクションに書き込みます。プロファイラーが作成する system.profile ドキュメントの概要については、「 データベース プロファイラーの出力」を参照してください。
プロファイラーはデフォルトで off です。プロファイラーは、複数のプロファイリング レベルのいずれかで、データベースごとまたはインスタンスごとに有効にできます。
プロファイリングを有効にすると、データベースのパフォーマンスとディスク使用量に影響します。 詳細については、「データベースプロファイラのオーバーヘッド」を参照してください。
このページには、データベースプロファイラーの重要な管理オプションが表示されます。詳細については、次を参照してください。
プロファイリング レベル
次のプロファイリング・レベルを使用できます。
データベース プロファイリングの有効化と構成
mongod インスタンスのデータベース プロファイリングを有効にできます。
プロファイリングを有効にするには、次のいずれかの方法を使用します。
スタートアップ時にプロファイリングを有効にするには、
operationProfiling.modeを構成ファイルに設定します。実行時にプロファイリングを有効にするには、
mongoshヘルパーメソッドdb.setProfilingLevel()を使用します。ドライバーでプロファイリングを有効にするには、ドライバー メソッドを使用します。
プロファイラーはデータを system.profile コレクションに記録します。MongoDB では、データベースのプロファイリングを有効にした後、そのデータベースに system.profile コレクションが作成されます。
起動時に mongod インスタンスのプロファイリングを有効にするには、operationProfiling.mode を構成ファイルで目的のログレベルに設定します。
プロファイリングを有効にしてプロファイリング レベルを設定するには、プロファイリング レベルをdb.setProfilingLevel()ヘルパーに渡します。 たとえば、現在接続されているデータベースのすべてのデータベース操作のプロファイリングを有効にするには、 mongoshで次の操作を実行します。
db.setProfilingLevel(2)shell は、was フィールドに前のプロファイリング レベルを返し、新しいレベルを設定します。次の出力における "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の値を設定します。
次の例では、現在接続されているデータベースのプロファイリング レベルを1 に設定し、mongod インスタンスにおける低速操作のしきい値を 20 ミリ秒に設定します。
db.setProfilingLevel( 1, { slowms: 20 } )プロファイリング レベルが 1 の場合、プロファイラーは slowms のしきい値よりも遅い操作を記録します。
重要
低速操作のしきい値は mongod インスタンスのすべてのデータベースに適用されます。この値はデータベースプロファイラーと診断ログの両方に使用されるため、パフォーマンスの低下を避けるために、最も有用な値に設定する必要があります。
You can use db.setProfilingLevel() to configure slowms and sampleRate for mongos. For the mongos, the slowms and sampleRate configuration settings only affect the diagnostic log and not the profiler since profiling is not available on mongos. [1]
次の例では、低速操作のログを 20 に記録するため、mongos インスタンスの低速操作のしきい値を設定します。
db.setProfilingLevel( 0, { slowms: 20 } )プロファイラー エントリと読み取り操作および書込み (write ) 操作の 診断ログ メッセージ(mongod/mongos ログ メッセージなど)には次のものが含まれます。
replica setのセカンダリ メンバーは、適用に低速操作しきい値よりも長い時間がかかるoplogをログに記録するようになりました。 これらの遅い oplog メッセージ:
ログは、テキスト
applied op: <oplog entry> took <num>msを含むREPLコンポーネントの下にあります。ログレベルに依存しない(システムレベルでもコンポーネントレベルでも)
プロファイル レベルに依存しないでください。
slowOpSampleRateの影響を受けます。
プロファイラーは遅い oplog エントリをキャプチャしません。
低速操作のランダム サンプルのプロファイリング
To profile only a randomly sampled subset of all slow operations, specify the desired sample rate in one of the following ways: [2]
profileコマンドまたはdb.setProfilingLevel()シェルヘルパー メソッドを使用してsampleRateの値を設定します。スタートアップ時にコマンドラインから
mongodの場合は--slowOpSampleRateの値、mongosの場合は--slowOpSampleRateの値を設定します。構成ファイルで
slowOpSampleRateの値を設定します。
デフォルトでは、sampleRate は 1.0 に設定されています。つまり、すべての低速操作がプロファイリングされます。sampleRate が 0 と 1 の間に設定されている場合、プロファイリング レベルが 1 のデータベースは、sampleRate に基づいてランダムにサンプリングされた割合で低速操作をプロファイリングします。
次の例では、現在接続されているデータベースのプロファイリング レベルを 1 に設定し、プロファイラーがすべての低速操作の 42% をサンプリングするように設定します。
db.setProfilingLevel( 1, { sampleRate: 0.42 } )変更されたサンプル レート値はシステム ログにも適用されます。
You can use db.setProfilingLevel() to configure slowms and sampleRate for mongos. For the mongos, the slowms and sampleRate configuration settings only affect the diagnostic log and not the profiler because profiling isn't available on mongos. [1]
次の例では、低速操作をログに記録するための mongos インスタンスのサンプリング レートを設定します。
db.setProfilingLevel( 0, { sampleRate: 0.42 } )重要
logLevelが0に設定されている場合、MongoDB は slowOpSampleRate で決定されたレートで低速操作を診断ログに記録します
logLevel設定を引き上げると、レイテンシに関係なく、すべての操作が診断ログに表示されます。ただし、セカンダリによる低速の oplog エントリ メッセージのログ記録は除きます。セカンダリでは、低速の oploglogLevel エントリのみがログに記録されます。 を引き上げても、すべての oplog エントリがログに記録されるわけではありません。
| [1] | (1、2)「データベースプロファイリングとシャーディング」を参照してください。 |
プロファイルされた操作を決定するためにフィルターを設定する
どの操作をプロファイリングしてログに記録するかは、フィルターの設定で制御できます。プロファイリング フィルターは、次のいずれかの方法で設定できます。
profileコマンドまたはdb.setProfilingLevel()シェルヘルパー メソッドを使用してfilterの値を設定します。
mongod インスタンスの場合、filter は診断ログと(有効になっている場合)プロファイラーの両方に影響します。
mongos インスタンスの場合、filter は診断ログにのみ影響し、プロファイラーには影響しません。プロファイリングは mongosでは使用できないためです。
注意
プロファイリングの filter が設定されている場合、slowms および sampleRate オプションは診断ログまたはプロファイラーに影響しません。
次の db.setProfilingLevel() の例では、現在接続されているデータベースのプロファイリング レベルを設定します。
プロファイリングレベル を
1に設定し、{ op: "query", millis: { $gt: 2000 } }のフィルター をかけると、プロファイラーは 2 秒以上かかったquery操作のみをログに記録します。
db.setProfilingLevel( 1, { 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 を指定します。
This sets the profiling level to 1, defines slow operations as those that last longer than 15 milliseconds, and specifies that only 50% of slow operations should be profiled. [2]
The slowms and slowOpSampleRate also affect the operations that are recorded in the diagnostic log when logLevel is set to 0. The slowms and slowOpSampleRate are also available to configure diagnostic logging for mongos. [2]
データベース プロファイリングとシャーディング
mongos インスタンスではプロファイリングを有効にできません。シャーディングされたクラスターでプロファイリングを有効にするには、クラスター内の各 mongod インスタンスのプロファイリングを有効にする必要があります。
ただし、--slowms と slowOpSampleRate を mongos で設定すると、低速操作の診断ログを構成できます。
プロファイラー データを表示
データベースプロファイラーは、データベース操作に関する情報を system.profile コレクションに記録します。
プロファイリング情報を表示するには、 system.profileコレクションをクエリします。 クエリの例を表示するには、「プロファイラー データ クエリの例」を参照してください。 出力データの説明については、「データベース プロファイラー出力 」を参照してください。
現在、トランザクション内から system.profile コレクションに対して任意の操作(読み取りなど)を行うことはできません。
プロファイラーのデータ クエリの例
このセクションでは、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 メッセージ:
プロファイラーは遅い oplog エントリをキャプチャしません。 |