本文介绍 SQL Server 中复制日志读取器和分发代理的性能统计信息工具。
原始产品版本:SQL Server
原始 KB 数: 2892631
简介
性能统计信息已添加到 mslogreader_history 表和 msdistribution_history Microsoft SQL Server 中分发数据库的表。 可以使用这些统计信息查看复制日志读取器和复制分发代理的最新性能历史记录。
注意
这些更改首先在以下 SQL Server 版本中进行:
- 9.00.4220
- 9.00.3315
- 10.00.1806
- 10.00.2714
每五分钟记录一次日志读取器和分发代理的性能统计信息记录在历史记录表中。 默认情况下,仅保留过去 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>
可以记录三个状态事件:
| 状态 | 说明 |
|---|---|
| 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>
注意
自laststats 提取等待时间 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>
自拉斯塔斯编写器等待统计信息为 288 秒时出现高。 这是编写器线程等待读取器线程提供要应用的缓冲区的时间。 日志读取器代理读取器线程执行 sp_replcmds 存储过程。 如果注意到日志读取器代理性能统计信息中的高写入器等待线程,则应调查日志读取器代理针对发布服务器和数据库执行的性能,然后调查存储过程的执行 sp_replcmds 时间。
下面是每个性能统计信息的说明:
| 统计信息 | 状态 | 说明 |
|---|---|---|
| State | 状态 1:此状态指示性能报告在批处理提交后通常。 状态 2:读取器线程指示批处理读取等待的时间长于 messageinterval 属性值。状态 3:编写器线程指示批处理写入等待的时间比 -messageinterval 值长。 |
|
| cmds | 仅 2 | 此状态指示分发代理读取的命令数。 |
| callstogetreplcmds | 仅 2 | 此状态指示分发代理对sp_MSget_repl_commands存储过程的调用数。 |
| work | 该值表示代理自上次代理启动以来所花费的累计时间。 时间不包括空闲时间。 | |
| 怠 | 该值表示代理在上一次调用返回无事务时或事务数小于自上次代理启动以来的属性值MaxTrans时等待调用sp_replcmds存储过程的累积时间。 |
|
| 读取器提取 | 该值表示读取器自上次代理启动以来所用的累积时间。 时间不包括空闲时间和等待写入器时间。 | |
| 读取器等待 | 该值表示自上次代理启动以来的累积等待写入时间。 该值显示等待写入器线程使用数据缓冲区完成的时间,然后读取器才能再次填充数据缓冲区。 | |
| 编写器写入 | 该值表示编写器自上次代理启动以来花费的累积时间。 时间不包括空闲时间和等待读取器时间。 对于编写器等待,此值表示自上次代理启动以来的等待读取器时间。 该值显示等待读取器线程完成填充数据缓冲区的时间,然后编写器才能应用数据缓冲区。 |
|
| sincelaststats_elapsed_time | 从上次记录的统计信息事件开始的时间段内,自“自统计信息”节点开始显示类似的统计信息。 默认情况下,时间段为 5 分钟。 时间不包括空闲时间。 该值表示自上次记录统计信息事件以来经过的时间。 | |
| sincelaststats 工作 | 该值表示代理自上次统计信息事件以来花费的时间。 | |
| sincelaststats cmds | 该值表示自上次统计信息事件以来的命令数。 | |
| sincelaststats cmdspersec | 该值表示自上次统计信息事件以来每秒执行的命令数。 | |
| sincelaststats\reader fetch | 该值表示读取器自上次统计信息事件以来花费的累积时间。 时间不包括空闲时间和等待写入器时间。 | |
| sincelaststats\reader wait | 该值表示自上次统计信息事件以来的累积等待写入时间。 该值显示等待编写器线程完成使用数据缓冲区的时间,然后读取器才能再次填充数据缓冲区。 | |
| sincelaststats\writer | 该值表示编写器自上次统计信息事件以来花费的累积时间。 时间不包括空闲时间和等待读取器时间。 | |
| sincelaststats\writer wait | 该值表示自上次统计信息事件以来的等待读取器时间。 该值显示等待读取器线程完成填充数据缓冲区的时间,然后编写器才能应用数据缓冲区。 |