Каково максимальное количество допустимых связанных действий для расширенного события?

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 Output:

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)
Райли Майор
источник

Ответы:

9

Сколько действий разрешено? Это зависит от события?

Я провел некоторое исследование, и да, существует ограничение на количество действий и событий, которые можно добавить в расширенное определение события. Это не «жесткое» значение, а основанное на множестве различных входных данных, поэтому одно определение, которое не работает, может работать только с удалением одного события или одного действия в одном событии.

И это, кажется, зависит от события, так как я смог получить 30 за sqlserver.sql_batch_completed.

Вы уже наткнулись на множество возможных конфигураций, так что вы знаете, что это не полностью зависит от количества действий. Это также не специфично для каждого события, но является комбинацией значений.

Что ты можешь сделать?

Первый пункт - данные переменной длины - самая большая проблема, с которой вы столкнетесь. Как вы узнаете, что такое переменная длина, а что нет? Если посмотреть в каталоге ХЕ sys.dm_xe_objectsконкретно на некоторые действия, вы увидите там type_nameи type_sizeстолбцы , которые могут быть полезны , чтобы увидеть , если вы добавляете кучу переменных размеров точек данных (размер 0 в скриншоте ниже).

введите описание изображения здесь

Теперь вы, вероятно, думаете - хорошо, это здорово, но я не знаю магического предела, так что это действительно не помогает. Ну, это так и не так. Если вы конкретно посмотрите на это с точки зрения чисел, то да, это не очень полезно ... однако это ужасный способ взглянуть на это. На это следует смотреть так: «Собираю ли я только те данные, которые мне нужны?» и в большинстве случаев вы никогда не столкнетесь с проблемой с этой ошибкой.

Если мы возьмем определение в вопросе, которое не работает, некоторая часть собранной информации, похоже, действительно не нужна. Вам действительно нужны стек вызовов, текущий идентификатор потока, время цикла процессора, рабочий адрес и адрес планировщика? Callstack является переменным, остальные являются фиксированными, поэтому просто исключив callstack, вы можете разместить в нем больше столбцов, если это необходимо. Я не говорю, что тебе нужно больше, но ты мог.

Весь смысл в том, чтобы ограничить определение настолько маленьким, насколько это необходимо. Сбор всего может привести к ошибкам (как у вас здесь), медленной работе системы, слишком большому количеству данных для анализа или даже к остановке системы. То, что ты можешь, не означает, что ты должен. Ничто не говорит о том, что эти ограничения будут изменяться или не изменяться между основными и второстепенными версиями, поэтому сохранение истинной минимальной потребности является лучшим предупреждением. Пожалуйста, не устанавливайте каждый флажок или добавляйте все возможные действия.

Шон Галларди
источник
Я столкнулся с похожими проблемами при добавлении слишком большого количества событий в один сеанс при тестировании инструмента QueryableXEventData, который я разрабатывал. Хороший совет - указывать только те события, действия и поля, которые действительно необходимы.
Дан Гузман,