この記事では、SQL Server のレプリケーション ログ リーダーとディストリビューション エージェントのパフォーマンス統計ツールについて説明します。
元の製品バージョン: SQL Server
元の KB 番号: 2892631
はじめに
Microsoft SQL Server のディストリビューション データベースの mslogreader_history テーブルと msdistribution_history テーブルにパフォーマンス統計が追加されました。 これらの統計を使用して、レプリケーション ログ リーダーエージェントとレプリケーションディストリビューションエージェントの最新のパフォーマンス履歴を確認できます。
Note
これらの変更は、次の SQL Server ビルドで最初に行われました。
- 9.00.4220
- 9.00.3315
- 10.00.1806
- 10.00.2714
ログ リーダーエージェントとディストリビューション エージェントのパフォーマンス統計は、5 分ごとに履歴テーブルに記録されます。 既定では、過去 48 時間のデータのみが保持されます。 クリーンアップ プロセスでは、48 時間以上前のデータが削除されます。 既定値は、 sp_changedistributiondb ストアド プロシージャを実行し、 history_retention パラメーターに新しい値を指定することで変更できます。
ログ リーダー エージェントの履歴テーブルからのパフォーマンス出力のサンプルを次に示します。
<stats state="1" work="9" idle="295"> <reader fetch="8" wait="0"/> <writer write="9" wait="0"/> <sincelaststats elapsedtime="304" work="9" cmds="52596" cmdspersec="5753.000000"> <reader fetch="8" wait="0"/> <writer write="9" wait="0"/> </sincelaststats> </stats>
記録できる状態イベントは 3 つあります。
| State | 説明 |
|---|---|
| 1 | リーダースレッドとライタースレッドの両方のパフォーマンスを記述する通常のイベント。 |
| 2 | エージェントのリーダー スレッドがエージェントの -messageinterval 時間より長く待機したときに発生するイベントが発生しました。 (既定では、時刻は 60 秒です)。エージェントに対して記録されている State 2 イベントに気付いた場合は、エージェントが変換先に変更を書き込むのに時間がかかっていることを示します。 |
| 3 | ライター スレッドが -messageinterval 時間より長く待機したときに、ログ リーダー エージェントによってのみ生成されるイベントが発生しました。 ログ リーダー エージェントに対して記録された状態 3 のイベントに気付いた場合は、エージェントがトランザクション ログからレプリケートされた変更をスキャンするのに時間がかかっていることを示します。 |
リーダー スレッドディストリビューション エージェント
次のパフォーマンス統計は、レプリケーション トポロジに待機時間があり、ボトルネックがディストリビューション エージェントリーダー スレッドである状況を示しています。 このスレッドは、ディストリビューション データベース (<Distribution サーバー>.MSdistribution_history。サブスクライバーで適用するコマンドのコメント テーブル)。
<stats state="1" work="14798" idle="2035">
<reader fetch="14798" wait="193"/>
<writer write="12373" wait="9888"/>
<sincelaststats elapsedtime="424" work="415" cmds="296900" cmdspersec="713.000000">
<reader fetch="415" wait="7"/>
<writer write="377" wait="212"/>
</sincelaststats>
</stats>
sincelaststats ライターの待機時間 (212 秒) が高く表示されます。 これは、ライター スレッドがサブスクライバー データベースでライター スレッドが適用できるバッファーをリーダー スレッドが提供するのを待機する時間です。 ディストリビューション エージェント リーダー スレッドは、sp_MSget_repl_commands ストアド プロシージャを実行します。
ディストリビューション エージェントのパフォーマンス統計でライターの待機時間が長い場合は、ディストリビューション サーバーとデータベースに対するディストリビューション エージェント実行のパフォーマンスを調査する必要があります。 特に、 sp_MSget_repl_commands ストアド プロシージャの実行時間を調査する必要があります。
ライター スレッドディストリビューション エージェント
次のパフォーマンス統計は、レプリケーション トポロジに待機時間があり、ボトルネックがディストリビューション エージェントリーダー スレッドである状況を示しています。 このスレッドは、ディストリビューション データベース (<Distribution サーバー>.MSdistribution_history。サブスクライバーで適用するコマンドのコメント テーブル)。
Note
状態は 2 で、出力は状態 1 の統計とは多少異なります。 状態 2 の状態データは、リーダー スレッドがディストリビューション エージェントの構成された-messageinterval値よりも長く待機する必要があることを示します。 既定では、 -messageinterval の値は 60 秒です。
<stats state="2" fetch="48" wait="384" cmds="1028" callstogetreplcmds="321">
<sincelaststats elapsedtime="312" fetch="47" wait="284" cmds="1028" cmdspersec="3.000000"/>
</stats>
-messageinterval値が大きくなると、次のような状態 1 の統計情報が再び表示されることがあります。
<stats state="1" work="1941" idle="0">
<reader fetch="717" wait="1225"/>
<writer write="1941" wait="134"/>
<sincelaststats elapsedtime="764" work="764" cmds="1170730" cmdspersec="1530.000000">
<reader fetch="258" wait="505"/>
<writer write="764" wait="50"/>
</sincelaststats>
</stats>
Note
sincelaststats のフェッチ待機時間が 505 秒と非常に高くなっています。
ディストリビューション エージェントのパフォーマンス統計でリーダーの待機時間が長い場合は、サブスクライバー サーバーとデータベースに対するディストリビューション エージェント実行のパフォーマンスを調査する必要があります。 プロファイラー トレース ツールを使用して、レプリケーション ストアド プロシージャの実行のパフォーマンスを調査します。 通常、ストアド プロシージャの名前は次のとおりです。
- sp_MSupd_<ownertablename>
- sp_MSins_<ownertablename>
- sp_MSdel_<ownertablename>
さらに、ボトルネックがハードウェアベースかシステムベースかを判断するには、パフォーマンス モニターを使用してシステムのパフォーマンスを監視します。 たとえば、パフォーマンス モニターを使用して物理ディスク カウンターを監視します。
ログ リーダー エージェントリーダー スレッド
次のパフォーマンス統計は、レプリケーション トポロジに待機時間があり、ボトルネックがログ リーダー エージェント リーダー スレッドである状況を示しています。 ログ リーダー エージェント リーダー スレッドは、パブリッシュされたデータベース トランザクション ログをスキャンして、ディストリビューション データベースに配信するコマンドを探します。
<Distribution server>..MSlogreader_history.Comments
<stats state="1" work="301" idle="0" >
<reader fetch="278" wait="0"/>
<writer write="12" wait="288"/>
<sincelaststats elapsedtime="301" work="301" cmds="104500" cmdspersec="347.000000">
<reader fetch="278" wait="0"/>
<writer write="12" wait="288"/>
</sincelaststats>
</stats>
sincelaststats ライター待機統計の 288 秒が高く表示されます。 これは、ライター スレッドがバッファーを提供して適用されるのをリーダー スレッドが待機する時間です。 ログ リーダー エージェント リーダー スレッドは、 sp_replcmds ストアド プロシージャを実行します。 ログ リーダー エージェントのパフォーマンス統計でライター待機スレッドの数が多い場合は、パブリケーション サーバーとデータベースに対するログ リーダー エージェントの実行のパフォーマンスを調べ、 sp_replcmds ストアド プロシージャの実行時間を調査する必要があります。
各パフォーマンス統計の説明を次に示します。
| 統計 | State | 説明 |
|---|---|---|
| 状態コード | 状態 1: この状態は、バッチ コミット後のパフォーマンス レポートが通常であることを示します。 状態 2: リーダー スレッドは、バッチ読み取りがプロパティの値よりも長い時間待機 messageinterval 示します。状態 3: ライター スレッドは、バッチ書き込みが -messageinterval 値よりも長い時間待機することを示します。 |
|
| cmds | 2 のみ | この状態は、ディストリビューション エージェントによって読み取られたコマンドの数を示します。 |
| callstogetreplcmds | 2 のみ | この状態は、ディストリビューション エージェントによるsp_MSget_repl_commands ストアド プロシージャの呼び出しの数を示します。 |
| work | この値は、エージェントが前回のエージェントの開始以降に作業に費やした累積時間を表します。 時間はアイドル時間を除外します。 | |
| アイドル | この値は、前回の呼び出しでトランザクションが返されない場合、またはトランザクションの数が前回のエージェントの開始以降の MaxTrans プロパティの値より小さい場合に、エージェントが sp_replcmds ストアド プロシージャの呼び出しを待機する累積時間を表します。 |
|
| リーダー フェッチ | この値は、前回のエージェントの開始以降にリーダーが費やした累積時間を表します。 この時間は、アイドル時間と書き込み待ち時間を除外します。 | |
| reader wait | この値は、前回のエージェントの開始以降の累積ライター待ち時間を表します。 この値は、ライター スレッドがデータ バッファーの使用を終了するのを待機してから、リーダーがデータ バッファーを再入力するまでに費やされた時間を示します。 | |
| ライター書き込み | この値は、最後のエージェントの開始以降にライターが費やした累積時間を表します。 この時間は、アイドル時間とリーダー待ち時間を除外します。 ライター待機の場合、この値は、最後のエージェントの開始以降のリーダー待機時間を表します。 この値は、ライターがデータ バッファーを適用する前に、リーダー スレッドがデータ バッファーの設定を完了するまでに費やされた時間を示します。 |
|
| sincelaststats_elapsed_time | sincelaststats ノードには、最後に記録された統計イベントから始まる期間の同様の統計が表示されます。 既定では、期間は 5 分です。 時間はアイドル時間を除外します。 この値は、最後に記録された統計イベントから経過した時間を表します。 | |
| sincelaststats work | この値は、エージェントが前回の統計イベント以降に費やした時間を表します。 | |
| sincelaststats cmds | この値は、最後の統計イベント以降のコマンドの数を表します。 | |
| sincelaststats cmdspersec | この値は、最後の統計イベント以降に 1 秒あたりに実行されるコマンドの数を表します。 | |
| sincelaststats\reader fetch | 値は、前回の統計イベント以降に閲覧者が費やした累積時間を表します。 この時間は、アイドル時間と書き込み待ち時間を除外します。 | |
| sincelaststats\reader wait | この値は、前回の統計イベント以降の累積ライター待ち時間を表します。 この値は、ライター スレッドがデータ バッファーを使用して終了するのを待機してから、リーダーがデータ バッファーを再入力するまでに費やされた時間を示します。 | |
| sincelaststats\writer | この値は、前回の統計イベント以降にライターが費やした累積時間を表します。 この時間は、アイドル時間とリーダー待ち時間を除外します。 | |
| sincelaststats\writer wait | 値は、最後の統計イベント以降のリーダー待機時間を表します。 この値は、ライターがデータ バッファーを適用する前に、リーダー スレッドがデータ バッファーの設定を完了するまでに費やされた時間を示します。 |