Qual è il numero massimo di azioni associate consentite per un evento esteso?


14

Se aggiungi "troppe" azioni a un evento in una sessione di evento, riceverai questo errore:

Messaggio 25639, livello 16, stato 23, riga 1 L'evento, "[nome evento]", supera il numero di azioni associate consentite.

Quante azioni sono consentite? Varia in base all'evento?

La risposta, basata sulla sperimentazione, sembra essere 27 per sqlserver.rpc_completed. Ma non ho trovato quel numero su alcuna documentazione Microsoft . E sembra variare a seconda dell'evento, dato che sono stato in grado di ottenere 30 per sqlserver.sql_batch_completed.

Codice di esempio che non riesce:

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

Codice di esempio che ha esito positivo (lo stesso tranne escludere l'ultimo elemento):

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

(Ho provato un paio di azioni diverse e non sembra correlare a quali azioni sono incluse, ma forse si basa sul conteggio totale dei personaggi dei nomi delle azioni?)

Elenco completo delle azioni con cui stavo lavorando:

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

VERSIONE @@ Uscita:

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)

Risposte:


9

Quante azioni sono consentite? Varia in base all'evento?

Ho fatto qualche ricerca e sì, c'è un limite al numero di azioni ed eventi che possono essere aggiunti a una definizione estesa dell'evento. Non è un valore "difficile" ma basato su molti input diversi, quindi una definizione che non funziona potrebbe funzionare con la semplice rimozione di un singolo evento o di una singola azione in un singolo evento.

E sembra variare a seconda dell'evento, dato che sono stato in grado di ottenere 30 per sqlserver.sql_batch_completed.

Ti sei già imbattuto nella miriade di configurazioni possibili, quindi sai che non è interamente basato sul numero di azioni. Inoltre, non è specifico per ciascun evento, ma una combinazione dei valori.

Cosa sai fare?

Il primo elemento è che i dati a lunghezza variabile sono il problema più grande che dovrai affrontare. Come fai a sapere qual è la lunghezza variabile e cosa no? Se guardi nel catalogo XE sys.dm_xe_objectsspecificamente alcune azioni, vedrai che ci sono type_namee type_sizecolonne che possono essere utili per vedere se stai aggiungendo un sacco di punti dati di dimensioni variabili (dimensione 0 nello screenshot qui sotto).

inserisci qui la descrizione dell'immagine

Ora, probabilmente stai pensando: va bene, ma non conosco il limite magico, quindi non è davvero utile. Bene, lo è e non lo è. Se lo guardi specificamente da un punto di vista dei numeri, allora sì, non è molto utile ... tuttavia questo è un modo terribile di vederlo. Dovrebbe essere considerato come "Sto solo raccogliendo i dati di cui ho bisogno?" e nella maggior parte dei casi non si verificherà mai un problema con questo errore.

Se prendiamo la definizione nella domanda che non funziona, alcune delle informazioni raccolte sembrano davvero non necessarie. Hai davvero bisogno di callstack, ID thread corrente, tempo di ciclo della cpu, indirizzo del lavoratore e indirizzo dello scheduler? Callstack è variabile, gli altri sono fissi, quindi eliminando il callstack è possibile inserirsi in più colonne se necessario. Non sto dicendo che ne hai più bisogno ma che potresti.

Il punto è limitare la definizione ad essere piccola quanto basta. La raccolta di tutto ciò comporterà errori (come hai fatto qui), lentezza del sistema, troppi dati per l'analisi o persino l'arresto del sistema. Solo perché puoi non significa che dovresti. Non c'è nulla che affermi che questi limiti cambieranno o non cambieranno tra le versioni principali o secondarie, quindi mantenere la vera necessità minima è la migliore prevenzione. Si prega di non solo selezionare ogni casella (gui) o aggiungere ogni azione possibile.


Ho riscontrato problemi simili durante l'aggiunta di troppi eventi a una singola sessione durante il test di uno strumento QueryableXEventData che stavo sviluppando. Specificare solo quegli eventi, azioni e campi effettivamente necessari è un buon consiglio.
Dan Guzman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.