SQL Server 扩展事件目标

SQL Server 扩展事件目标是事件使用者。目标可以写入文件、聚合事件数据或启动与事件相关的任务。目标可以同步或异步处理数据。

扩展事件的设计确保了对于每个会话都保证目标收到并仅收到一次事件。

扩展事件提供以下可用于扩展事件会话的目标:

  • Event bucketing

    用于基于指定的事件列或操作,对指定事件发生的次数进行计数。

  • Event pairing

    许多类型的事件是成对发生的,例如锁获取和锁释放。用于确定指定的成对的事件何时未成对发生。

  • Event Tracing for Windows (ETW)

    用于将 SQL Server 事件与 Windows 操作系统或应用程序事件数据相关联。

  • Event file

    用于将事件会话输出从完整内存缓冲区写入磁盘。

  • Synchronous event counter

    计算在扩展事件会话过程中发生的指定事件的数目。用于获取有关工作负荷特征的信息而不必因进行完整的事件收集而增加系统开销。

  • Ring buffer

    用于在先进先出 (FIFO) 的基础上或按事件 FIFO 的基础上将事件数据保存在内存中。

目标可以划分为文件目标和内存中目标。

  • 事件文件目标和 ETW 目标被视为文件目标。

  • 事件存入桶、事件配对、同步事件计数器和环形缓冲区目标被视作内存中目标,在其中,数据存储于会话的缓冲区中(sys.dm_xe_session_targets 动态管理视图的 target_data 列)。

请注意,在您停止使用内存中目标的某一会话时,在该会话的缓冲区中存储的所有信息都将丢失。如果您想要在停止该会话后访问事件数据,则应或者配置该会话以便使用某一文件目标(推荐),或者在停止该会话之前保存数据。

您可以根据以下准则来帮助您确定要使用的目标。

目标

推荐用法

事件文件目标或 ETW 目标

在以下一个或多个条件成立时使用文件目标:

  • 您想要执行长期的数据收集。

  • 您想要收集大量事件的数据。

  • 您想要出于历史记录目的保存事件数据。

环形缓冲区目标

在以下条件成立时使用环形缓冲区目标:

  • 您想要执行持续收集数据的循环跟踪,但只关心最近的事件(大约 2 MB 的事件数据)。或者,您想要执行短期的数据收集,并且查看最近的事件。

  • 您想要查看在会话的缓冲区中捕获的所有事件数据。换言之,您想要插件原始数据,而非聚合的信息。

  • 您不必出于历史记录目的保存事件数据。

事件存入桶目标、事件配对目标或者同步事件计数器目标

在以下条件成立时使用这些内存中目标之一:

  • 您想要通过使用可执行某种形式的分析和事件数据的聚合的目标,解决特定的问题。例如,您可能想要知道任何事务是否保持打开状态(事件配对目标),或者,您想要看到在某一给定时间段中有哪些按 CPU 使用率的 TOP 查询(事件存入桶目标)

  • 您想要执行短期的数据收集。

  • 您不必出于历史记录目的保存事件数据。

事件存入桶目标

事件存入桶目标基于事件数据对特定事件类型的发生进行分组。“存储桶”是基于特定事件列或操作进行计数的一组事件。您可以使用事件存入桶目标来排除性能问题。通过标识哪些事件发生的频率最高,您就可以找到可能引起性能问题的“作用点”。

下表描述了能够用来配置事件存入桶目标的选项。

选项

允许的值

说明

slots

任何整数值。此值为可选值。

用户指定值,指示要保留的存储桶的最大数目。达到此值后,将忽略那些不属于现有存储桶的新事件。

filtering_event_name

扩展事件会话中存在的任何事件。此值为可选值。

用于标识事件类的用户指定值。只有指定事件实例才会存储在桶中。所有其他事件都被忽略。

如果指定该值,您必须使用如下格式:package_name.event_name,例如 'sqlserver.checkpoint_end'。使用以下查询可以标识包名称:

SELECT p.name, se.event_name
FROM sys.dm_xe_session_events se
JOIN sys.dm_xe_packages p
ON se_event_package_guid = p.guid
ORDER BY p.name, se.event_name

如果不指定 filtering_event_name 值,则必须将 source_type 设为 1(默认值)。

source_type

存储桶基于的对象的类型。该值是可选的,并且如果未指定值,则使用默认值 1。

可以是下列值之一:

  • 0 = 事件

  • 1 = 操作

source

事件列或操作名称。

用作数据源的事件列或操作名称。

当为源指定事件列时,必须从用作 filtering_event_name 值的事件中指定列。使用以下查询可以标识潜在列:

SELECT name FROM sys.dm_xe_object_columns
WHERE object_name = '<eventname>'
AND column_type != 'readonly'

当为源指定事件列时,不一定要在源值中包括包名称。

当为源指定操作名称时,必须使用在此目标所用于的事件会话中为收集配置的一个操作。若要查找操作名称的潜在值,可以查询 sys.dm_xe_sesssion_event_actions 视图的 action_name 列。

如果将操作名称作为数据源使用,则必须通过使用以下格式指定源值:package_name.action_name。

下例说明了事件存入桶目标如何在高级别收集数据。在此示例中,您希望使用事件存入桶目标来计数每种等待类型中发生的等待数。为此,您将会在定义事件存入桶目标时指定以下选项:

  • filtering_event_name = 'wait_info'

  • source = 'wait_type'

  • source_type = 0(因为 wait_type 是个事件列)

在此示例中,针对 wait_type 源记录了以下数据。

筛选事件名称

源列值

wait_info

file_io

wait_info

file_io

wait_info

network

wait_info

network

wait_info

sleep

等待类型值可以通过以下值和槽计数而划分为三个存入桶:

槽计数

file_io

2

network

2

sleep

1

有关事件存入桶目标语法的详细信息,请参阅如何使用扩展事件监视系统活动

存入桶目标只保留指定源的事件数据。某些情况下,事件数据可能太大而无法完全保留,这时便会截断数据。截断事件数据后,将记录字节数并以 XML 输出方式显示出来。

存入桶目标将数据以 XML 格式序列化到一个调用程序或过程中。

注意注意

存入桶输出不遵从任何架构。

下例说明了存入桶目标的输出格式。

<Slots truncated = "0" buckets=[count]>
    <Slot count=[count] trunc=[truncated bytes]>
        <value>
        </value>
    </Slot>
</Slots>

事件配对目标

事件配对目标使用两个事件中存在的一列或多列数据来对这两个事件进行匹配。许多事件是成对的,例如,锁获取和锁释放。对某个事件序列配对完毕,便会放弃这两个事件。放弃匹配完毕的事件便于检测哪些获取的锁尚未释放。

通过使用事件级别筛选器,可以使用配对目标仅捕获那些与预设条件不匹配的事件。

使用事件配对目标时,可以选择两个要匹配的事件和一个序列,此序列由要对其进行匹配的列构成。此序列中的所有列必须属于同一类型。

下表描述了配置事件配对时可用的选项。

选项

允许的值

说明

begin_event

当前会话中存在的任何一个事件的名称。

用于指定成对序列中开始事件的事件名称。

end_event

当前会话中存在的任何一个事件的名称。

用于指定成对序列中结束事件的事件名称。

begin_matching_columns

一个以逗号分隔的列名称排序列表。

要对其执行匹配的列。

end_matching_columns

一个以逗号分隔的列名称排序列表。

要对其执行匹配的列。

begin_matching_actions

一个以逗号分隔的操作排序列表。

要对其执行匹配的操作。

end_matching_actions

一个以逗号分隔的操作排序列表。

要对其执行匹配的操作。

respond_to_memory_pressure

可以是以下值之一:

  • 0 = 不响应。

  • 1 = 内存不足时停止向列表添加新的孤立项。

目标对内存事件予以响应。如果设为 1,则服务器内存不足时,将删除保留的不成对信息。

系统将捕获并存储与某个事件相关联的所有数据,以供将来配对之用。此外,还将收集由操作添加的数据。收集的事件数据存储在内存中,因此会有一定的限制。此限制基于系统容量和活动。所用内存量将根据可用系统资源来决定,而不是以最大内存量作为限定因素。内存不足时,将删除已经保留的不成对事件。如果某事件尚未成对便被删除,则与之匹配的事件将作为不成对事件出现。

配对目标会将不成对事件序列化为 XML 格式。此格式不遵从任何架构,只包含两种元素类型。<unpaired> 元素是根元素,后跟一个 <event> 元素(对于当前正跟踪的每个不成对事件)。<event> 元素包含一个属性,其中包含不成对事件的名称。

下例说明了配对目标的输出格式。

<unpaired truncated = "0" matchedCount = "[matched count]" memoryPressureDroppedCount = " [lost count]">
    <event name  = "[event name]" package = "[package]" id= "[event ID value]" version = "[event version]">
    <data name = "[column name]"> 
    <type name = "[column type]" package = "[type package]" /> 
    <value>[column value]</value>
    <text value>[text value]</text>>
        </data>
    </event>
</unpaired>

Windows 事件跟踪目标

在将 Windows 事件跟踪 (ETW) 作为目标使用前,建议您先掌握 ETW 的相关使用知识。ETW 跟踪或者与扩展事件结合使用,或者用作扩展事件的事件使用者。您可以从以下外部链接入手,获取有关 ETW 的背景信息:

扩展事件支持 Windows XP 和 Windows Server 2003 版本的 ETW。ETW 目标是单独目标,尽管该目标可以被添加到多个会话中。如果某事件在多个会话中被引发,则该事件在每次发生事件时仅被传播给 ETW 目标一次。每个进程仅限一个扩展事件引擎实例。

重要说明重要提示

为使 ETW 目标能够工作,SQL Server 服务启动帐户必须是性能日志用户组的成员。

对于 ETW 会话中存在的事件,其配置由承载扩展事件引擎的进程来控制。引擎控制着激发哪些事件,以及必须满足哪些条件才能激发事件。

在绑定到扩展事件会话之后,即在进程的生存期中首次附加 ETW 目标之后,ETW 目标会在 SQL Server 访问接口上打开一个单独的 ETW 会话。如果已经存在 ETW 会话,ETW 目标将获取对现有会话的引用。此 ETW 会话由给定计算机上的所有 SQL Server 实例共享,并从具有此 ETW 目标的会话接收所有事件。

由于 ETW 需要启用访问接口才能使用事件并将事件发送给 ETW 会话,因而对此会话启用所有扩展事件包。激发事件后,ETW 目标将事件发送给对其启用了事件访问接口的会话。

ETW 目标支持对激发事件的线程同步发布事件。但是,ETW 目标不支持异步事件发布。

ETW 目标不支持来自外部 ETW 控制器(例如 logman.exe)的控制。若要生成 ETW 跟踪,必须使用 ETW 目标创建事件会话。有关详细信息,请参阅 CREATE EVENT SESSION (Transact-SQL)

注意注意

启用 ETW 目标将创建一个名为 XE_DEFAULT_ETW_SESSION 的 ETW 会话。如果名为 XE_DEFAULT_ETW_SESSION 的会话已经存在,则使用该会话而不修改现有会话的任何属性。XE_DEFAULT_ETW_SESSION 由所有 SQL Server 实例共享。启动了 XE_DEFAULT_ETW_SESSION 后,必须使用 ETW 控制器(如 Logman 工具)停止它。例如,可以在命令提示符处运行以下命令:logman stop XE_DEFAULT_ETW_SESSION -ets。

下表介绍了配置 ETW 目标时可用的选项。

选项

允许的值

说明

default_xe_session_name

最多 256 个字符的任何字符串此值为可选值。

扩展事件会话名称。默认情况下为 XESESSION0_4B7A5EC6-37EF-4d4c-81EC-13C547B9AC46。

default_etw_session_logfile_path

最多 256 个字符的任何字符串此值为可选值。

扩展事件会话日志文件的路径。默认情况下为 %TEMP%\ XEEtw.etl。

default_etw_session_logfile_size_mb

任何无符号整数。此值为可选值。

扩展事件会话日志文件的大小 (MB)。默认值为 20 MB。

default_etw_session_buffer_size_kb

任何无符号整数。此值为可选值。

扩展事件会话内存缓冲区的大小 (KB)。默认值为 128 KB。

retries

任何无符号整数。

尝试将事件发布给 ETW 子系统的重试次数,在此次数之后将删除该事件。默认值为 0。

上述设置的配置是可选的。ETW 目标使用这些设置的默认值。

ETW 目标负责下列操作:

  • 创建默认的 ETW 会话。

  • 向 ETW 注册所有扩展事件包。这样可以确保 ETW 不会删除事件。

  • 管理事件向 ETW 的发送。ETW 目标使用扩展事件数据创建 ETW 事件并将其发送给相应的 ETW 会话。如果事件的大小超过缓冲区的大小,或数据无法容纳到一个 ETW 事件中,则 ETW 将把事件拆分成几个片段。

  • 使扩展事件包在任何时候均保持为启用状态。

ETW 使用以下默认文件位置:

  • ETW 输出文件的格式为 %TEMP%\XEEtw.etl。

    重要说明重要提示

    当第一个会话启动后不能再更改该文件路径。

  • 托管对象格式 (MOF) 文件位于 <您的安装路径>\Microsoft SQL Server\Shared 下。有关详细信息,请参阅 MSDN 上的 Managed Object Format(管理对象格式)。

事件文件目标

事件文件目标是可将完整的缓冲区写入磁盘的异步目标。文件目标可创建两种类型的文件,即日志文件和元数据文件。元数据文件对目标输入日志文件中的事件内容进行说明。这样,就可以正确地分析日志文件中的所有事件,并可正确分析与事件关联的操作数据。

若要使用此目标,必须指定日志文件和元数据文件的位置名称。其他配置选项,例如文件大小和增长特征等都是可选项。

下表描述了配置事件文件目标时可用的选项。

选项

允许的值

说明

filename

最多 260 个字符的任何字符串。此值为必需值。

文件位置和文件名。

可以使用任何文件扩展名。

max_file_size

任何 64 位整数。此值为可选值。

文件的最大值 (MB)。如果未指定 max_file_size,则文件将一直增长到磁盘变满为止。默认文件大小为 1GB。

max_file_size 必须大于会话缓冲区的当前大小。否则,文件目标将无法初始化,并报告 max_file_size 无效。若要查看缓冲区的当前大小,请查询 sys.dm_xe_sessions 动态管理视图中的 buffer_size 列。

如果默认文件大小小于会话缓冲区大小,建议将 max_file_size 设置为 sys.server_event_sessions 目录视图中的 max_memory 列中指定的值。

将 max_file_size 的大小设置为大于会话缓冲区大小时,它可能会向下舍入到最近的会话缓冲区大小的倍数。这样所产生的目标文件的大小可能小于指定值 max_file_size。例如,如果缓冲区大小为 100MB 并且 max_file_size 设置为 150MB,则因为在剩余的 50MB 空间中无法放下第二个缓冲区,生成的文件的大小会向下舍入到 100MB。

如果默认文件大小小于会话缓冲区大小,建议将 max_file_size 设置为 sys.server_event_sessions 目录视图中的 max_memory 列中的值。

max_rollover_files

任何 32 位整数。此值为可选值。

文件系统中可保留的最多文件数。

increment

任何 32 位整数。此值为可选值。

文件的增量 (MB)。如果未指定,则增量的默认值为会话缓冲区大小的两倍。

metadatafile

最多 260 个字符的任何字符串。此值为必需值。

文件元数据的位置和名称。

第一次创建文件目标时,会在指定的文件名后面附加 _0_ 以及一个长整型值。该整型值被计算为 1600 年 1 月 1 日与文件的创建时间之间的毫秒数。后续的回滚文件也将使用此格式。通过检查该长整型值,可以确定最新的文件。以下示例演示了文件的命名方式。在该方案中,将文件名选项指定为 C:\OutputFiles\MyOutput.xel:

  • 创建的第一个文件 - C:\OutputFiles\MyOutput_0_128500310259380000.xel

  • 第一个滚动更新文件 - C:\OutputFiles\MyOutput_0_128505831770890000.xel

  • 第二个滚动更新文件 - C:\OutputFiles\MyOutput_0_132410772966237000.xel

同步事件计数器目标

同步事件计数器目标将计算在扩展事件会话过程中激发的所有事件数目。使用同步事件计数器目标可以获取有关工作负荷特征的信息而不必因进行完整的事件收集而增加系统开销。此目标不包含任何可自定义的参数。

下例说明了同步事件计数器目标的输出。

<CounterTarget truncated = "0">
  <Packages>
    <Package name = "[package name]">
      <Event name = "[event name]" count = "[number]" />
    </Package>
  </Packages>
</CounterTarget>

环形缓冲区目标

环形缓冲区目标主要是在内存中容纳事件数据。此目标可通过以下两种模式中的一种来管理事件。

  • 第一种模式是严格的先进先出 (FIFO),在这种模式下,当分配给目标的所有内存都用尽时,将放弃最旧的事件。在这种模式下(默认模式),occurrence_number 选项设为 0。

  • 第二种模式是按事件 FIFO,在这种模式下,每种类型将保留指定数量的事件。在这种模式下,当分配给目标的所有内存都用尽时,将放弃每种类型的最旧的事件。您可以配置 occurrence_number 选项来指定要保留的每种类型的事件数。

下表描述了配置环形缓冲区目标时可用的选项。

选项

允许的值

说明

default_memory

任何 32 位整数。此值为可选值。

要使用的最大内存量 (KB)。达到此值时将删除现有事件。

occurrence_number

可以是以下值之一:

  • 0 (默认值) = 当分配给目标的所有内存都用尽时,将放弃最旧的事件。

  • 任何 32 位整数 = 按事件 FIFO,在放弃前要保留的每种类型的事件数。

此值为可选值。

FIFO 模式使用,如果设为大于 0 的值,要保留到缓冲区的每种类型的首选事件数。

下面的示例说明了环形缓冲区目标的输出。

<RingBufferTarget eventsPerSec="" processingTime="" totalEventsProcessed="" eventCount="" droppedCount="" memoryUsed="">
 <event name="" package="" id="" version="" timestamp="">
    <data name="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </data>
    <action name="" package="">
      <type name="" package="" />
      <value></value>
      <text></text>
    </action>
  </event>
</RingBufferTarget>

更改历史记录

更新的内容

向“Windows 事件跟踪”部分添加了有关 XE_DEFAULT_ETW_SESSION 会话的说明。

在简介中,添加了对每个目标类型的简短说明,并且添加了推荐用法准则。