已将新的并行和调度诊断添加到 SQL Server 中

文章翻译 文章翻译
文章编号: 319892 - 查看本文应用于的产品
错误号:102179 (SQLBUG_70)
错误号:356317 (SQLBUG_80)
展开全部 | 关闭全部

本文内容

概要

为保持高度的动态性,SQL Server 包含了几个内部进程来确保稳定性。其中一个示例就是锁定监视器,您可使用该监视器识别和解决死锁问题。

SQL Server 7.0 Service Pack 4 (SP4) 和 SQL Server 2000 Service Pack 3 (SP3) 都添加了增强的进程运行状况监视功能。运行状况监视增强功能用在以下方面:
  • 阻塞
  • 网络问题
  • 输入/输出 (IO)
  • 内存
  • CPU
如果 SQL Server 检测到运行状况问题,则将一系列新的错误信息(如下面的错误信息)写入 SQL Server 错误日志。有关这些错误信息产生条件的详细信息,请参见本文的“更多信息”一节。

SQL Server 7.0

Error 1223:Process ID %d:%d cannot acquire lock "%s" on resource %s because a potential deadlock exists on Scheduler %d for the resource.Process ID %d:%d holds a lock "%h" on this resource.

SQL Server 2000

Error 1229:Process ID %d:%d owns resources that are blocking processes on scheduler %d.
新的错误信息包括以下几种。

扩展的锁定检测: 1223, 1229
调度程序挂起检测:17881, 17883
所有调度程序挂起检测: 17882, 17884
Warning Note that a health related problem is often the result of a condition that was experienced previously.You must study the SQL Server error log and the system event logs carefully to determine the actual root cause.

For example, a 17883 error message may indicate a scheduler problem.However, the error log may show a previous exception that incorrectly left the SQL Server process in a poor state, or the application might have caused a severe blocking condition.
注意:Microsoft 试图保持所有内容与最新的 17883 条件同步更新。但是,17883 错误信息是可由多种原因触发的运行状况检测消息。 Microsoft 不仅纠正了 SQL Server 软件产品的已知问题,而且在与 SQL Server 软件无关的许多情况中也遇到了 17883 错误。例如,由于外部应用程序占用 CPU 和硬件故障也会引发此错误。要避免该错误再次发生,必须确定产生 17883 错误信息的根本原因。

更多信息

本节将概述运行状况增强功能和可以写入 SQL Server 错误日志的相关错误信息。

UMS

为了更好地理解一些附加的运行状况诊断,您必须首先理解 SQL Server 是如何使用 User Mode Scheduling (UMS) Ums.dll 帮助文件的。

SQL Server 7.0 和 Microsoft SQL Server 2000 都使用逻辑调度程序。这些调度程序可帮助确保 SQL Server 能最大限度地利用与关键数据库操作路径相关的操作系统资源。UMS 层可确保 SQL Server 正确使用 Win32 事件,严格控制线程和纤程(或两者)调度对操作系统的可见性。通过严格控制可以运行的线程或纤程,当涉及数据库基元(如锁定)时,SQL Server 可以最大限度地使用 CPU。

例如,逻辑调度允许锁定等待线程休眠(Win32 事件上的 WaitForSingleObject),直到锁定所有者解除锁定并发出信号 (SetEvent) 将其唤醒。

扩展的锁定检测

锁定监视器功能已得到扩展,可以检测(工作线程)资源级别的阻塞情形。如果拥有锁定的 SPID 当前正在调度程序中排队,由于已创建所有分配的工作线程,而且这些分配的工作线程都处于无穷尽的等待状态,因此下面的错误信息将写入 SQL Server 错误日志:

SQL Server 7.0

Error 1223:Process ID %d:%d cannot acquire lock "%s" on resource %s because a potential deadlock exists on Scheduler %d for the resource.Process ID %d:% d holds a lock "%h" on this resource.
参数描述:
  1. 等待的 SPID
  2. 等待的 ECID(子进程执行 ID)
  3. 锁定模式名
  4. 资源名
  5. 逻辑 UMS 调度程序 ID
  6. 拥有的 SPID
  7. 拥有的 ECID
  8. 拥有的资源名

SQL Server 2000

Error 1229:Process ID %d:%d owns resources that are blocking processes on scheduler %d.
参数描述:
  1. 拥有的 SPID
  2. 拥有的 ECID(子进程执行 ID)
  3. 拥有的逻辑 UMS 调度程序 ID

跟踪标志

SQL Server 包含一个跟踪标志,用于禁用此运行状况报告。

要禁用此报告行为,请使用下列方法之一:
  • 建立一个启动参数 (-T###)
  • 使用 DBCC TRACEON(###)
SQL Server 7.0:-T1216

SQL Server 2000:-T1261

注意:这不是排版错误。SQL Server 2000 上的 -T1216 已经用作与死锁输出关联的跟踪标志。因此改用 1261。

示例情形

客户机 1 连接到 SQL Server 上。

客户机 1 运行 Transact-SQL 命令,该命令启动一个事务并执行数据修改。

例如:
begin tran
update authors set au_lname = 'test'
客户机 1 变为 IDLE,显示为休眠状态,并等待 sysprocesses 系统表中带有打开事务的命令。

客户机 2 到 255:大约 254 多台客户机登录到 SQL Server,并从作者表发布 SELECT 命令。这些客户机在初始更新时将全部阻塞。

客户机 1 试图提交事务,但是由于客户机 2 到 255 占用了所有工作线程,因此客户机 1 只能排队。

阻塞

该错误信息通常指示存在大量的阻塞情况。每次锁定监视器运行时(大约每隔 5 秒钟),就会向 SQL Server 错误日志添加消息。

注意:对于每个遇到资源问题的 SPID/ECID 都将写入一条消息。因此,在同一个锁定监视器迭代期间,可以写入多条消息。

SQL Server 不能自动解决这个问题。但是,它会将该问题指示为错误信息(1223 或 1229)。如果发生此问题,可以通过多种方式解决。

锁定或查询超时

如果查询使用锁定或查询超时,该问题通常可以在发生超时时自行解决。但是,这种情况值得研究,因为它指示某个应用程序导致了并行进程的减少。

Transact-SQL KILL

如果管理员能够查询 sysprocesses 系统表,则他们可以使用 Transact-SQL KILL 命令终止 BLOCKING SPID 以及相应的 BLOCKED SPIDS 来释放工作线程,将系统返回正常状态。
251004 INF:如何监视 SQL Server 7.0 阻塞
271509 如何监视 SQL Server 2000 阻塞
263889 由于 COMPILE 锁定导致 SQL 阻塞

支持帮助

如果无法获得 sysprocesses 系统表信息,则可以获取 (Sqlservr.exe) 进程的一个进程转储,并联系 Microsoft SQL Server 支持部门,以做出进一步的研究。

并行查询

在极少数情况下,由于并行查询计划选择得不好,会出现此错误信息。如果并行查询选择使用大量可用的 SQL Server 工作线程来完成查询,则它可能会耗尽 SQL Server 工作池。sysprocesses 系统表包含一个 ECID 列,用于指示代表单个 SPID 所使用的工作线程数。如果相对于计算机的实际 CPU 而言 ECID 的值过高,则通常指示该查询调整得不好。请查看查询计划和最大并行度 (MAXDOP) 查询选项的设置,以便正确调整该有问题的查询。

调度程序问题

逻辑调度程序的数量至关重要。当 SQL Server 启动时,最大工作线程设置在各逻辑调度程序之间是平均分配的。随着可供 SQL Server 使用的 CPU 数量的增多,工作队列将划分得更细。呈示不需要的事务作用域活动的应用程序在有更多的 CPU 可用时会更快地显示出资源短缺情况。对于此类情况,应用程序的事务作用域会立即被修正。

下表显示了最大工作线程sp_configure 存储过程设置等于 255 时,根据 CPU 的数量分配工作池的情况。
收起该表格展开该表格
CPU 阻塞链长
1255
2128
464
832
1616
建议您将最大工作线程设置保持为默认的 255。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
319942 如何确定正确的 SQL Server 配置设置

UMS 运行状况

已添加一个新的内部例程,每隔 60 秒检测一次逻辑调度程序的运行状况。如果断定调度程序已停用或调度程序停止响应,则会将相应的错误信息写入 SQL Server 错误日志。每隔 60 秒写入一条错误直到问题解决。

如上文所述,这些消息通常是以前某个事件的指示。仔细查阅 SQL Server 错误日志和应用程序事件日志将有助于您确定问题的根本原因。

注意:每隔 60 秒拍摄一次快照。因此在第一次检测情况时,可能已经过去 120 秒。

SQL Server 7.0

Error:17881 - The Scheduler %1!ld! appears to be hung.PSS 0x%2!p!, EC 0x%3!p !, UMS Context 0x%4!p!
Error:17882 - Potential deadlocks exist on all the schedulers

跟踪标志

如果使用 -T1217 启动参数来启动 SQL Server 7.0,则可以禁用这两个检查。

SQL Server 2000 SP3

8.00.760 (SP3)
Error:17883 - The Scheduler %1!ld! appears to be hung.SPID %2!ld!, ECID %3! ld!, UMS Context 0x%4!p!

8.00.765

从 8.00.765 修复程序开始,该消息已更改以更具描述性。
Error:17883 - Process %1!ld!:%2!ld!(%3!lx!)UMS Context 0x%4!p! appears to be non-yielding on Scheduler %5!ld!

Example:
2003-03-21 08:22:20.27 server Error:17883, Severity:1, State:0
2003-03-21 08:22:20.27 server Process 51:0 (dbc) UMS Context 0x018DA930 appears to be non-yielding on Scheduler 0.
2003-03-21 08:22:22.45 server Stack Signature for the dump is 0x00000000
Error:17884 - Potential deadlocks exist on all the schedulers

跟踪标志

如果使用 -T1260 启动参数来启动 SQL Server,则可以禁用这两个检查。

SQL Server 2000 MiniDump 文件

从 SQL Server 2000 SP3 开始,已实现了捕获 MiniDump 进程的能力。从内部版本 8.00.765 开始,SQL Server 第一次检测到停用的调度程序时就生成 MiniDump 文件。

要防止不断为这些错误信息(17883 和 17884)生成 MiniDump 文件,默认做法是在 SQL Server 进程的生命周期内生成单个 MiniDump 文件。要在每次出现此消息时启用 MiniDump 文件,请打开跟踪标志 -T1262。

MiniDump 文件在 LOG 文件夹中生成,名为 SQLDmpr###.mdmp。Microsoft 支持部门可以对该 MiniDump 文件进行评估,以帮助确定问题的根本原因。

Error 17881 和 Error 17883

这些消息指示单个 UMS 调度程序遇到转交问题。运行状况监视程序检测到,似乎某个调度程序的工作线程不允许其他工作线程运行,并且该调度程序已标记为无响应。停止响应的调度程序通常是 SQL Server 产品或外部组件(Xproc、COM 对象等)中存在错误。

下面是已知的 17833 条件的一些示例。请确保搜索 Microsoft 知识库,查找相关的文章。如果您的系统需要更新的修补程序,请相应地应用修补程序。
815056 FIX:检查点进程可能延迟 SQL Server 数据库活动,没有正确转交调度程序而导致产生 Error:17883(错误:17883)
810885 高端磁盘子系统可能发生错误 17883
如果不能立即确定根本原因,请查阅问题的错误日志,并寻求其他支持。

调度程序无法正常响应时,它可能会降低 SQL Server 总体的并行性。SQL Server 也可能显示为停用或停止响应。

Error 17882 和 17884

这些消息指示所有 UMS 调度程序都遇到转交问题。这表明出现了 SQL Server 系统范围的问题,并且 SQL Server 看起来已停止响应。对于 17881 和 17883 消息,请查阅错误日志和 Microsoft 知识库,以了解更多信息。如有必要,请寻求其他支持。

属性

文章编号: 319892 - 最后修改: 2005年9月5日 - 修订: 8.0
这篇文章中的信息适用于:
  • Microsoft SQL Server 2000 Service Pack 3
  • Microsoft SQL Server 7.0 Service Pack 4
关键字:?
kberrmsg kbinfo kbbug kbfix kbsample KB319892
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com