扩展事件允许的最大绑定动作数是多少?


14

如果在事件会话中向事件添加“太多”操作,则会收到此错误:

消息25639,级别16,状态23,第1行该事件“ [事件名称]”超出了允许的绑定操作数。

允许多少动作?它会因事件而变化吗?

根据实验,答案似乎是27 sqlserver.rpc_completed。但是我在任何Microsoft文档中都没有找到这个数字。而且似乎因事件而异,因为我能够获得30分sqlserver.sql_batch_completed

失败的示例代码:

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username,
        sqlserver.plan_handle))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

成功的示例代码(除了最后一项外,其他代码相同):

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

(我尝试了几种不同的动作,它似乎与所包含的动作无关,但也许是基于动作名称的总字符数?)

我正在执行的操作的完整列表:

package0.callstack,
package0.collect_cpu_cycle_time,
package0.collect_current_thread_id,
package0.collect_system_time,
package0.event_sequence,
package0.last_error,
package0.process_id,
sqlos.cpu_id,
sqlos.numa_node_id,
sqlos.scheduler_address,
sqlos.scheduler_id,
sqlos.system_thread_id,
sqlos.task_address,
sqlos.task_elapsed_quantum,
sqlos.task_resource_group_id,
sqlos.task_resource_pool_id,
sqlos.task_time,
sqlos.worker_address,
sqlserver.client_app_name,
sqlserver.client_connection_id,
sqlserver.client_hostname,
sqlserver.client_pid,
sqlserver.context_info,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.is_system,
sqlserver.nt_username,
sqlserver.plan_handle,
sqlserver.query_hash,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash,
sqlserver.query_plan_hash_signed,
sqlserver.request_id,
sqlserver.server_instance_name,
sqlserver.server_principal_name,
sqlserver.server_principal_sid,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.session_resource_group_id,
sqlserver.session_resource_pool_id,
sqlserver.session_server_principal_name

@@ VERSION输出:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 
    Oct 28 2016 18:17:30 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

Answers:


9

允许多少动作?它会因事件而变化吗?

我做了一些研究,是的,可以添加到扩展事件定义中的动作和事件的数量是有限的。它不是一个“硬”值,而是基于许多不同的输入,因此,一个不起作用的定义仅适用于删除单个事件或单个事件中的单个动作。

而且似乎因事件而异,因为我能够获得30 sqlserver.sql_batch_completed.

您已经偶然发现了可能的多种配置,因此您知道它并不完全基于操作数。它也不特定于每个事件,而是值的组合。

你能做什么?

第一项是可变长度数据是您要面对的最大问题。您怎么知道什么是可变长度,什么不是?如果您sys.dm_xe_objects专门查看XE目录中的某些操作,您会看到有type_nametype_size列,这些列对于查看是否要添加一堆可变大小的数据点(在下面的屏幕快照中为0)非常有用。

在此处输入图片说明

现在,您可能在想-好的,但是我不知道神奇的极限,所以它真的没有帮助。好吧,它确实是,不是。如果您专门从数字的角度来看它,是的,它并不是很有帮助...但是,这是一种糟糕的观察方法。应该将其视为:“我仅收集所需的数据吗?” 在大多数情况下,您永远都不会遇到此错误的问题。

如果我们在问题不正确的问题中采用定义,那么似乎收集到的某些信息似乎确实不是必需的。您是否真的需要调用堆栈,当前线程ID,CPU周期时间,工作人员地址和调度程序地址?调用栈是可变的,其余的都是固定的,因此只需消除调用栈即可,如果需要的话,您可以将其放入更多列中。我并不是说您需要更多,但您可以。

重点是将定义限制为所需的最小值。收集所有内容将导致错误(如您在此处所述),系统运行缓慢,无法分析的数据过多,甚至导致系统停机。仅仅因为可以做并不意味着你应该做。没有任何说明说明这些限制在主要版本或次要版本之间会或不会改变,因此保持真正的最低需求是最好的预防措施。请不要仅选中每个复选框(gui)或添加所有可能的操作。


在测试我正在开发的QueryableXEventData工具时,在单个会话中添加过多事件时遇到了类似的问题。仅指定那些实际需要的事件,操作和字段是很好的建议。
Dan Guzman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.