SQL Server 扩展事件简介

SQL Server 扩展事件 (Extended Events) 是用于服务器系统的常规事件处理系统。扩展事件基础结构支持 SQL Server 中数据的关联,并且在某些情况下,还支持操作系统和数据库应用程序中数据的关联。对于后一种情况,必须将扩展事件输出定向到 Windows 事件跟踪 (ETW),才能使事件数据与操作系统或应用程序事件数据建立关联。

所有应用程序都具有在应用程序外部和内部均有用的执行点。在应用程序内部,可以使用任务初始执行期间收集到的信息对异步处理进行排队。在应用程序外部,执行点为监视实用工具提供被监视应用程序的行为和性能特征的有关信息。

扩展事件支持在进程外部使用事件数据。此类数据通常由以下工具或用户使用:

  • 跟踪工具,如 SQL 跟踪和系统监视器。

  • 日志记录工具,如 Windows 事件日志或 SQL Server 错误日志。

  • 管理某个产品或为某个产品开发应用程序的用户。

扩展事件的设计与功能

扩展事件的设计涉及以下主要方面:

  • 由于扩展事件引擎不识别事件,因此,引擎可以将任何事件绑定到任何目标,因为引擎不受事件内容约束。有关扩展事件引擎的详细信息,请参阅 SQL Server 扩展事件引擎

  • 事件与事件使用者不同,后者在扩展事件中称为“目标”。也就是说任何目标可以接收任何事件。此外,引发的任何事件均可供目标自动使用,这样可以记录或提供额外的事件上下文。有关详细信息,请参阅 SQL Server 扩展事件目标

  • 事件不同于在事件激发时要执行的操作。因此,任何操作可以与任何事件相关联。

  • 谓词可以动态筛选事件的激发,从而增强了扩展事件基础结构的灵活性。有关详细信息,请参阅 SQL Server 扩展事件包

扩展事件可以同步生成事件数据(并异步处理该数据),这为事件处理提供了灵活的解决方案。此外,扩展事件提供以下功能:

  • 一种跨服务器系统处理事件的统一方法,同时使用户可以隔离特定的事件进行故障排除。

  • 与现有的 ETW 工具集成并支持现有的 ETW 工具。

  • 基于 Transact-SQL 的完全可配置的事件处理机制。

  • 可以动态监视活动进程,同时对这些进程的影响最小。

结合使用扩展事件和 ETW

如果您想使用扩展事件来关联操作系统和数据库应用程序中的数据,建议您先掌握 ETW 的使用知识。ETW 可以与扩展事件结合使用,或用作扩展事件的事件使用者。您可以从以下主题入手,获取有关 ETW 的背景信息:

使用扩展事件的应用场景

扩展事件可以用于多种监视和故障排除情况。以下应用场景阐释了这样几种情形,扩展事件可以提供有价值的数据来解决以下这些方面的问题:

  • 解决工作集修整的问题。

  • 解决 CPU 使用率过高的问题。

  • 排除死锁故障。

  • 将请求活动与 Windows ETW 日志相关联。

解决工作集修整的问题

生产服务器发生严重性能问题,导致客户端应用程序超时。这些问题似乎是瞬态问题,10-15 分钟后性能便会恢复正常。

通过查看 SQL Server 错误日志,您发现如下错误消息:

"A significant part of the server process has been paged out.This may result in performance degradation.Duration: 300 seconds.Current memory utilization 34%."(“服务器进程的一个重要组成部分已被页面调出。这可能会导致性能下降。持续时间:300 秒。当前内存使用率 34%。”)

"Non-yielding IOCP Listener."(“IOCP 侦听器无法完成。”)

注意注意

IOCP 是“IO 完成端口”(IO Completion port) 的缩写。该端口为网络上的用户请求提供服务。该消息表明完成端口在最后一分钟被阻止。

您怀疑 SQL Server 对服务器上的内存不足压力没有足够快速地予以响应。当使用任务管理器检查内存时,您发现服务器上的可用内存似乎还是相当充足的。您尝试从 SQL Server Management Studio 连接到数据库,但连接尝试超时。您可以通过在 Windows 命令提示符处发出 SQLCMD - A 命令连接到服务器。这会打开一个专用管理员连接会话。

您决定使用扩展事件来获取更多信息。创建一个扩展事件会话以实现以下功能:

  • 添加系统内存信号通知事件和服务器内存总计更改事件。

  • 将输出定向到 ETW。此输出将被写入在页文件或 SQL Server 数据库文件不使用的驱动器上创建的一个文件。

在 Windows 命令提示符处,执行一条指令,以便对所有内存事件启用 Windows 内核 ETW 跟踪。让这两个跟踪执行几分钟的时间,然后关闭扩展事件会话和 Windows 内核跟踪。

使用 tracerpt.exe 将 Windows 跟踪和 SQL Server ETW 跟踪相关联。查找一个表示以前设置了系统内存不足通知的事件,但未找到。而是看到大量的页错误,它们来自服务器上的所有进程。在紧邻分页之前查看这些事件,并且发现为响应某个驱动程序的内存分配请求,所有进程的工作集都被修整了。

解决 CPU 使用率过高的问题

您正在调查生产系统上 CPU 使用率过高的问题。使用各种动态管理视图 (DMV) 确定是否可以将 CPU 的使用归为之前在系统上执行的查询所致。此检查表明,大多数查询均为即席用户查询。从 DMV 获得的信息还不足以诊断该问题。

创建一个扩展事件会话以实现以下功能:

  • 启用语句完成(具有指定 CPU 阈值的谓词)事件。

  • 使操作在事件激发时只收集查询计划。

  • 将收集到的所有数据写入一个文件。此文件位于不包含任何日志或数据库文件的驱动器上。

启动扩展事件会话之后,通过检查输出内容,您可以确定此 CPU 问题是由两个通常联接在一起的表之间进行数据类型转换所致的。

排除死锁故障

您收到来自用户的报告,指出某些应用程序返回死锁错误。为尽快解决这些问题,您决定将调查重点放在最经常发生的死锁上。创建一个扩展事件会话以实现以下功能:

  • 为会话配置死锁事件跟踪。

  • 指定一个基于死锁标识符进行聚合的目标。

运行扩展事件会话,当报告出现其他死锁后,您便能够获取聚合的死锁信息以及每个源的完整 XML 死锁图形。使用此信息,您可以鉴别出那些最常见的死锁,从而实施相应解决方案。

将请求活动与 Windows ETW 日志相关联

您正在解决生产服务器上某个应用程序运行速度下降的问题,并能够将原因限定在磁盘读取时间较长这一方面。创建一个扩展事件会话以实现以下功能:

  • 添加磁盘读取会话事件。

  • 将收集到的数据发送到 ETW。

启动扩展事件会话后,运行一个 Windows ETW 内核跟踪。10 分钟后停止这两个会话。

使用 tracerpt.exe 合并 Windows 跟踪和 SQL ETW 跟踪。从这个合并后的跟踪,您可以关联并跟踪从 SQL Server 到 Windows 内核的读请求。此分析结果表明,在 I/O 请求返回 SQL Server 之前存在较长时间的延迟。使用此信息便可以断定此 I/O 问题在于物理 I/O 路径。