レプリケーション ログ リーダーおよびレプリケーションディストリビューション エージェントのパフォーマンス統計ツールの概要

この記事では、SQL Serverのレプリケーション ログ リーダーとディストリビューション エージェントのパフォーマンス統計ツールについて説明します。

元の製品バージョン: SQL Server
元の KB 番号: 2892631

概要

Microsoft SQL Server のmslogreader_historyディストリビューション データベースのテーブルとmsdistribution_historyテーブルにパフォーマンス統計が追加されました。 これらの統計を使用して、レプリケーション ログ リーダーおよびレプリケーション配布エージェントの最新のパフォーマンス履歴を確認できます。

注:

これらの変更は、最初に次の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 つあります。

状態 説明
1 リーダーとライターの両方のスレッドのパフォーマンスを表す通常のイベント。
2 エージェントのリーダー スレッドがエージェントの時間よりも長く待機したときに発生するイベントを -messageinterval 発生させます。 (既定では、時刻は 60 秒です)。エージェントに対して記録された状態 2 のイベントに気付いた場合は、エージェントが変換先に変更を書き込むのに長い時間がかかっていることを示します。
3 ライター スレッドが時間よりも長く待機するときに、ログ リーダー エージェントによってのみ生成されるイベントを -messageinterval 発生させます。 ログ リーダー エージェントに対して記録された状態 3 イベントに気付いた場合は、エージェントがトランザクション ログからレプリケートされた変更をスキャンするのに長い時間がかかっていることを示します。

リーダー スレッドディストリビューション エージェント

次のパフォーマンス統計は、レプリケーション トポロジに待機時間があり、ボトルネックがディストリビューション エージェントリーダー スレッドである状況を示しています。 このスレッドは、ディストリビューション データベース (<ディストリビューション サーバー>..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 必要があります。

ライター スレッドディストリビューション エージェント

次のパフォーマンス統計は、レプリケーション トポロジに待機時間があり、ボトルネックがディストリビューション エージェントリーダー スレッドである状況を示しています。 このスレッドは、ディストリビューション データベース (<ディストリビューション サーバー>..MSdistribution_history。サブスクライバーに適用するコマンドのコメント テーブル)。

注:

状態は 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>

注:

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 必要があります。

各パフォーマンス統計の説明を次に示します。

統計情報 状態 説明
状態 状態 1: この状態は、バッチ コミット後のパフォーマンス レポートが通常であることを示します。

状態 2: リーダー スレッドは、バッチ読み取りがプロパティの値 messageinterval よりも長い時間待機することを示します。

状態 3: ライター スレッドは、バッチ書き込みが値よりも -messageinterval 長い時間待機することを示します。
cmds 2 のみ この状態は、ディストリビューション エージェントによって読み取られたコマンドの数を示します。
callstogetreplcmds 2 のみ この状態は、ディストリビューション エージェントによるストアド プロシージャへのsp_MSget_repl_commands呼び出しの数を示します。
作業時間 値は、エージェントが最後のエージェントの開始以降に作業に費やした累積時間を表します。 時間はアイドル時間を除外します。
アイドル 値は、前の呼び出しでトランザクションが返されない場合、またはトランザクションの数が前回のエージェントの開始以降のプロパティの値よりも小さい場合に、エージェントがストアド プロシージャの呼び出 sp_replcmds しを待機する累積時間 MaxTrans を表します。
リーダーフェッチ 値は、前回のエージェントの開始以降に閲覧者が費やした累積時間を表します。 この時刻は、アイドル時間と書き込み待ち時間を除外します。
リーダー待機 値は、前回のエージェントの開始以降の累積書き込み待機時間を表します。 値は、ライター スレッドがデータ バッファーを使用して終了するまでに費やされた時間を示し、読み取り者がデータ バッファーを再び埋めることができます。
ライター書き込み 値は、最後のエージェントの開始以降にライターが費やした累積時間を表します。 時間には、アイドル時間と読み取り待ち時間が除外されます。

ライター待機の場合、この値は、前回のエージェントの開始以降のリーダー待ち時間を表します。 値は、ライターがデータ バッファーを適用する前に、リーダー スレッドがデータ バッファーの設定を完了するまでに費やされた時間を示します。
sincelaststats_elapsed_time sincelaststats ノードには、最後に記録された統計イベントから始まる期間の同様の統計が表示されます。 既定では、期間は 5 分です。 時間はアイドル時間を除外します。 値は、最後に記録された統計イベントから経過した時間を表します。
sincelaststats work 値は、エージェントが最後の stats イベント以降に費やした時間を表します。
sincelaststats cmds 値は、最後の stats イベント以降のコマンドの数を表します。
sincelaststats cmdspersec 値は、最後の stats イベント以降に 1 秒あたりに実行されるコマンドの数を表します。
sincelaststats\reader fetch 値は、前回の stats イベント以降に閲覧者が費やした累積時間を表します。 この時刻は、アイドル時間と書き込み待ち時間を除外します。
sincelaststats\reader wait 値は、最後の stats イベント以降の累積書き込み待ち時間を表します。 値は、ライター スレッドがデータ バッファーの使用を終了するまでに費やされた時間を示し、リーダーがデータ バッファーを再び埋めることができます。
sincelaststats\writer 値は、最後の stats イベント以降にライターが費やした累積時間を表します。 時間には、アイドル時間と読み取り待ち時間が除外されます。
sincelaststats\writer wait 値は、最後の stats イベント以降の読み取り待ち時間を表します。 値は、ライターがデータ バッファーを適用する前に、リーダー スレッドがデータ バッファーの設定を完了するまでに費やされた時間を示します。