拡張イベントに許可されるバインド済みアクションの最大数はいくつですか?


14

イベントセッションのイベントに「多すぎる」アクションを追加すると、次のエラーが表示されます。

メッセージ25639、レベル16、状態23、行1イベント "[イベント名]"は、許可されたバインドアクションの数を超えています。

許可されるアクションの数 イベントによって異なりますか?

実験に基づく答えは、27のようですsqlserver.rpc_completed。しかし、Microsoftのドキュメントにはその番号がありません。また、イベントごとに異なるようです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

許可されるアクションの数 イベントによって異なりますか?

私はいくつかの調査を行いました。はい、拡張イベント定義に追加できるアクションとイベントの数には制限があります。これは「ハード」な値ではなく、さまざまな入力に基づいているため、機能しない1つの定義は、単一のイベントまたは単一のイベントの単一のアクションを削除するだけで機能します。

そして、イベントごとに異なるようです。 sqlserver.sql_batch_completed.

あなたはすでに可能な無数の構成に出くわしているので、アクションの数に完全に基づいているわけではないことを知っています。また、各イベントに固有ではなく、値の組み合わせです。

何ができる?

最初の項目は、可変長データが直面する最大の問題であることです。可変長とそうでないものをどのようにして知るのですか?sys.dm_xe_objects特にいくつかのアクションでXEカタログを見ると、さまざまなサイズのデータ​​ポイント(下のスクリーンショットのサイズ0)を追加しているかどうかを確認するのに役立つ列type_nametype_size列があります。

ここに画像の説明を入力してください

今、あなたはおそらく考えている-それは素晴らしいですが、私は魔法の限界を知らないので、それは本当に役に立ちません。そうです、そうではありません。数字の観点から具体的に見ると、そうではありません。しかし、これは恐ろしい見方です。「必要なデータのみを収集していますか?」と見なす必要があります。そして、で、ほとんどの場合、あなたは、このエラーの問題に遭遇することは決してないだろう。

うまくいかない質問の定義をとると、収集された情報の一部は、実際には必要ないように見えます。コールスタック、現在のスレッドID、CPUサイクル時間、ワーカーアドレス、およびスケジューラアドレスが本当に必要ですか?コールスタックは可変であり、残りは固定されているため、必要に応じて、より多くの列に収まるようにコールスタックを削除するだけです。私はあなたこれ以上必要だと言っているわけではありませんが、可能です。

全体のポイントは 制限し、必要に応じて小型のように定義します。すべてを収集すると、エラー(ここで発生した)、システムの速度低下、分析するためのデータが多すぎる、またはシステムが停止する可能性があります。できるからといって、そうすべきだというわけではありません。これらの制限がメジャーバージョンまたはマイナーバージョン間で変更される、または変更されないことを示すものはないため、真の最小ニーズを維持することが最善の予防です。すべてのボックス(gui)をチェックしたり、可能なすべてのアクションを追加したりしないでください。


開発中のQueryableXEventDataツールをテストするときに、1つのセッションに追加するイベントが多すぎると、同様の問題が発生しました。実際に必要なイベント、アクション、およびフィールドのみを指定することをお勧めします。
ダン・グスマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.