使用实用程序或更改 CPU 频率的技术时,SQL Server 计时值可能不正确


概要


Microsoft SQL Server 2005年使用高分辨率的 CPU 计数器提供微秒计时功能。一微秒是百万分之一秒 (或一千分之一,以毫秒为单位)。但是,SQL Server 计时值可能不正确如果您使用更改 CPU 频率的技术。例如,当您使用以下技术之一,则可能发生此问题:
  • CPU 步进
  • AMD Cool'n' 安静技术
  • 不同的电源方案
本文的方法和其他信息来帮助您解决此问题。

症状


当设置统计时间语句用于显示服务器执行、 分析和编译时间时,可能会获得错误的值。例如,您可能会注意到 SQL Server 执行时间的时间是更多的 CPU 时间比。此问题可能会影响性能调优的准确性。使用在服务器上的"摘要"部分列出的技术之一时,将出现此问题。

原因


因为 CPU 频率已更改时使用这些技术,将出现此问题。SQL Server 2005 使用高分辨率的 CPU 计数器提供微秒计时功能。如果更改了 CPU 的频率,以节省能源并减少热量输出,计算的工期可能不正确。

解决方案


Service Pack 信息

若要解决此问题,请获取最新的 service pack,SQL Server 2005。有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
913089如何获取最新的 service pack,SQL Server 2005
注意:在 SQL 服务器 2005 Service Pack 3 和更高版本的服务包,未使用的处理器时间戳。这些版本的 SQL Server 2005 使用更可靠计时器具有最大精度为 1 毫秒。

状态


此问题最早在 SQL 服务器 2005 Service Pack 3 中。

解决方法


SQL Server 2005 要求已知的和稳定的数据点进行精确的性能调整。 如果在计算机上启用了动态 CPU 频率调整,您可以禁用它们,以便 Cpu 监视和优化 SQL Server 性能在开始之前保持稳定的频率。为此,使用下列方法。

要强制保持在最大频率的 Cpu 的计算机上配置的电源使用方案

若要执行此操作,请执行以下步骤:
  1. 单击开始,单击运行,键入Powercfg.cpl,,然后单击确定
  2. 电源选项属性对话框中,单击始终在列表中的电源使用方案
  3. 单击确定
可能会出现偏差。偏移是 CPU 频率值之间的区别。有关详细信息,请参阅"偏差"一节。在这种情况下,您必须重新启动 Windows 后更改电源使用方案重新同步的所有 Cpu 的频率。

如果无法重新启动计算机,启用 SQL Server 处理器关系以防止 SQL Server 辅助线程 Cpu 之间移动。执行此操作时,您没有重新启动计算机,即使 CPU 频率值之间的区别。 若要启用 SQL Server 的服务器上的所有 Cpu 的处理器关系,必须使用不同的掩码,具体取决于服务器上的逻辑处理器数。

下表列出了示例方案。
CPU 数若要启用处理器关系的语句
02 Cpuexec sp_configure 相似性,0x00000003
转到
重新配置
转到
04 Cpuexec sp_configure 相似性,0x0000000F
转到
重新配置
转到
08 Cpuexec sp_configure 相似性,0x000000FF
转到
重新配置
转到
16 Cpuexec sp_configure 相似性,0x0000FFFF
转到
重新配置
转到
32 Cpuexec sp_configure 0xFFFFFFFF 亲和力掩码
转到
重新配置
转到
注意:它可能不足以禁用 BIOS 级别的 CPU 频率变体功能。 各种第三方实用程序,可以更改 CPU 频率。 即使在 Cpu 下最大的电源使用方案设置,某些实现使频率调整。在这种情况下,您必须禁用这些第三方实用程序执行的性能调整功能在 SQL Server 2005 时。

使用第三方实用程序和驱动程序来同步 CPU 频率和 CPU 时钟计数器

在极少数情况下,系统可能需要更新从制造商联系,以解决 CPU 频率问题。它是一种最佳做法,以检查系统的最新 BIOS、 微码和固件更新,如果您怀疑系统可能有问题。

详细信息


Microsoft SQL Server 2000年和早期版本的 SQL Server 使用 Windows 计时机制。计时机制使用毫秒精度值。 通常情况下,此精度不过是 10 到 15 女士,可能大至 55 毫秒精度。 SQL Server 查询经常在单数字毫秒内完成或微秒时间跨越。此精度要求高分辨率计时器。 因此,这些版本的 SQL Server 报告某些查询的持续时间为 0 的女士因此,很难监控性能和调整 SQL Server 早期版本的 SQL Server 中的性能。

SQL Server 2005 使用高分辨率的 CPU 计数器提供微秒计时功能,提高了准确性。在"摘要"一节中使用列出的技术时,报告的时间值可能不正确。

此问题可能会影响以下对象和功能:
  • 跟踪事件:
    • 注意事件
    • 存储过程节点中的事件
    • 在 TSQL 节点中的事件
    • 在对象节点中的事件
    • 在交易记录节点中的事件
  • 动态管理视图:
    • sys.dm_exec_query_stats
    • sys.dm_exec_requests
    • sys.dm_exec_sessions
    • sys.dm_io_pending_io_requests

    • sys.dm_os_ring_buffers
    • sys.dm_os_sys_info
    • sys.dm_io_virtual_file_stats
    • sys.dm_os_wait_stats
  • 设置统计信息 TIME 语句
  • Sysprocesses系统表
安装 SQL 2005 Service Pack 2 (SP2) 后,SQL Server 记录在错误日志中错误消息,当 SQL Server 检测高精度计时器 Cpu 之间同步。错误消息指示,可能不准确,性能计时,用户应谨慎使用性能数据。

错误消息的文本类似于下面的错误消息之一:
错误消息 1
在计划程序 id 为 2 的 CPU 时间戳计数器与其他 Cpu 不同步。
错误消息 2
CPU 时间戳频率已从 191469 到 1794177 / 毫秒为单位的刻度。将使用新频率
SQL Server 使用实际时间戳计数器 (RDTSC) 指令获得 64 位 CPU 滴答计数。可以将此值除以 CPU 频率将值转换为毫秒值。 CPU 频率改变或偏移发生,可能会出现计时变体。

CPU 步进

CPU 步进 CPU 频率中被定义为故意更改。 CPU 步进可能也被称为英特尔 SpeedStep 技术或 AMD PowerNow !技术。当 CPU 单步执行发生时,CPU 速度可能增加或减少 50 MHz,以节省能源并减少热量输出尽可能小的增量。 在同一个非一致内存访问 (NUMA) 节点的 Cpu 不单独调整频率。

下表阐释如何 CPU 单步执行的更改可能会影响时间计算。
操作RDTSC 刻度刻度数 / 毫秒为单位 (频率)墙上的时钟时间
开始批处理12000
频率下移2001001ms
结束批处理5003ms
总计5004ms
SQL Server 捕获的 RDTSC 刻度的开始和结束的 RDTSC 刻度处。然后,SQL Server 将刻度除以频率值。

在此示例中,使用频率值 200 或 100 时,将发生下列时间计算:
  • 频率 200: 500/200 = 2.5 毫秒
  • 频率 100: 500/100 = 5 毫秒
这两个计时计算匹配 4 ms 的实际挂钟时间。

如果这一计算中使用RPC: 完成错误报告跟踪事件、持续时间结束时间的数据列。RPC: 完成事件可捕获起始的挂钟时间和 CPU 点击计数。 以获得更高的分辨率计时不是 Windows 提供了 SQL Server 2005,持续时间结束时间在 SQL Server 中的数据列中,请通过使用已用的 CPU 滴答计数计算跟踪。结束时间列的计算方法将持续时间列添加到开始时间列中。 在此示例中,结束时间列的计算方法不正确加 2.5 毫秒或 5 毫秒的开始时间。

偏移

偏移是 CPU 时钟值的偏离。 具有多个 Cpu 的系统可以及时产生不同的 CPU 时钟值相同的点。 虽然不常见,但 Cpu 可能会出现时钟分离一段时间。

下面的示例演示如何偏移更改可能会影响结果的 SQL Server 跟踪中的持续时间数据列。 本示例假定 CPU 频率保持稳定在 200 / 毫秒为单位的刻度。下表阐释了此方案中的事件。
操作Windows 计划的 CPUCPU 1 RDTSCCPU 2 RDTSC墙上的时钟时间
开始批处理110011000
结束批处理290019004 ms
总计4 ms
SQL Server 捕获的 RDTSC 刻度的起始点和结束点。然后,SQL Server 将 RDTSC 刻度数除以频率值。在此示例中,窗口安排 SQL Server 辅助线程在两个不同的 Cpu 上。 第一个 cpu (CPU 1) 第一次运行服务批处理 SQL Server 辅助线程。

但是,在某些时候,中断执行批处理而且 SQL Server 发送到等待队列执行批处理。当 SQL Server 发送 SQL Server 辅助线程再次服务于此批到可运行队列时,则 Windows 调度 (CPU 2) 另一个 CPU 上运行的线程。 SQL Server 辅助线程完成 CPU 2 上运行。 由于 CPU 偏移捕捉从 CPU 2 的结尾刻度值而 1900 而不是 900。 如果启用 SQL Server 处理器关联,则可以避免这种现象。

在此示例中使用下列时间计算:
  • 不正确,但报告值:(1900年-100 = 1800年) / 200 = 9 毫秒
  • 纠正值:(900-100 = 800) / 200 = 4 毫秒
持续时间列的值RPC: 完成事件将报告为 9 毫秒,而不是 4 女士此结果是一倍以上 4 ms 的正确值。

偏移的警告消息被添加到 SQL Server 2005,以指示前面提到的性能输出可能不可靠。在某些未被覆盖的情况下,SQL Server 2005 SP2 可能有关下列报告的警告消息:
  • 假的偏移的警告消息
  • 偏移可以成为数十个毫秒不会导致明显的系统效果
当您评估与性能相关的输出并比较性能相关墙上时钟频率设置为输出时,您必须非常小心。如果没有其他性能问题的迹象,您通常可以忽略偏移的警告消息。例如,您通常可以忽略偏移警告消息在以下情况下:
  • 进程正在运行正常。
  • SQL Server 查询没有奇怪的 durational 模式中运行。
  • 看不到其他瓶颈的迹象。
但是,您可以忽略警告消息,我们建议您联系偏移之前您的制造商联系,以确保没有已知 RDTSC 问题存在。

您可以使用跟踪标志 8033 (-T8033) 返回到此报告行为,以及 SQL Server 2005 SP1 中的 SQL Server 2005 的原始发行版。原始发行版的 SQL Server 2005 和 SQL Server 2005 SP1 不报告偏移的警告消息。如果您正在运行原始发行版的 SQL Server 2005 或 SQL Server 2005 SP1 没有问题,通常可以忽略这些消息。

为什么无法延迟 WAITFOR 语句工作正常? 定期的系统进程呢?

超时机制不受高分辨率的设计。SQL Server 不会基于计时器的活动中使用高分辨率计时器。 某些超时活动基于使用GetTickCount函数降低的分辨率计时器。这些超时活动包括锁超时、 延迟 WAITFOR 语句和死锁检测。
有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

938448如果服务器使用双核 AMD 皓龙处理器或多处理器 AMD 皓龙处理器,基于 Windows Server 2003 的服务器可能会遇到时间戳计数器偏移

895980使用 QueryPerformanceCounter 函数的程序可以很好地运行在 Windows Server 2003 和 Windows XP 中

本文讨论的第三方产品是由与 Microsoft 无关的公司生产的。Microsoft 不做这些产品的任何担保、默示或其他有关的性能或可靠性。