확장 이벤트에 허용되는 최대 바운드 조치 수는 얼마입니까?


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)

답변:


9

몇 개의 동작이 허용됩니까? 행사마다 다릅니 까?

나는 약간의 연구를했고, 확장 된 이벤트 정의에 추가 할 수있는 동작 및 이벤트의 수에는 제한이 있습니다. "하드"값은 아니지만 많은 다른 입력을 기반으로하므로 작동하지 않는 하나의 정의는 단일 이벤트를 제거하거나 단일 이벤트에서 단일 조치로 작동 할 수 있습니다.

그리고 나는 30을 얻을 수 있었기 때문에 사건마다 다를 것 같습니다 sqlserver.sql_batch_completed.

이미 가능한 수많은 구성을 우연히 발견 했으므로 전체 동작 수를 기반으로하지는 않습니다. 또한 각 이벤트에 한정되지 않고 값의 조합입니다.

당신은 무엇을 할 수 있나요?

첫 번째 항목은 가변 길이 데이터가 가장 큰 문제라는 것입니다. 가변 길이가 무엇인지 아닌지 어떻게 알 수 있습니까? 당신은 XE 카탈로그를 보면 sys.dm_xe_objects일부 작업에서 특히, 당신이 볼 수 type_nametype_size(아래 스크린 샷에서 공의 크기) 가변 크기 데이터 포인트의 무리를 추가하고 있는지 확인하는 것이 유용 할 수 있습니다 열.

여기에 이미지 설명을 입력하십시오

자, 당신은 아마 생각하고 있습니다-좋습니다. 훌륭하지만 마법의 한계를 모르므로 실제로 도움이되지 않습니다. 글쎄요, 그렇지 않습니다. 숫자 관점에서 구체적으로 살펴보면별로 도움이되지 않습니다 ... 그러나 이것은 그것을 보는 끔찍한 방법입니다. "필요한 데이터 만 수집합니까?" 과에서 대부분의 경우이 오류의 문제로 실행되지 않을 것이다.

작동하지 않는 질문에 대한 정의를 취하면 수집 된 일부 정보는 실제로 필요하지 않은 것처럼 보입니다. 콜 스택, 현재 스레드 ID, CPU 사이클 시간, 작업자 주소 및 스케줄러 주소가 정말로 필요합니까? 콜 스택은 가변적이고 나머지는 고정되어 있으므로 필요한 경우 더 많은 열에 맞출 수있는 콜 스택을 제거하면됩니다. 난 당신 더 이상 필요하다는 말 은 아니지만 할 수 있습니다.

요점은 정의를 필요한만큼 작게 제한 하는 것입니다. 모든 것을 수집하면 오류 (여기에서와 같이), 시스템 속도 저하, 분석하기에 너무 많은 데이터 또는 시스템 정지가 발생할 수 있습니다. 그렇다고해서 꼭해야한다는 의미는 아닙니다. 이러한 제한이 메이저 버전과 마이너 버전 사이에서 변경되거나 변경되지 않을 것이라는 내용은 없습니다. 따라서 최소 요구 사항을 유지하는 것이 최선의 예방책입니다. 모든 상자 (gui)를 선택하거나 가능한 모든 조치를 추가하지 마십시오.


개발중인 QueryableXEventData 도구를 테스트 할 때 단일 세션에 너무 많은 이벤트를 추가 할 때 비슷한 문제 가 발생했습니다. 실제로 필요한 이벤트, 조치 및 필드 만 지정하는 것이 좋습니다.
Dan Guzman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.