จำนวนการกระทำที่ถูกผูกไว้สูงสุดที่อนุญาตสำหรับเหตุการณ์ที่ขยายคืออะไร


14

หากคุณเพิ่มการกระทำ "มากเกินไป" ให้กับกิจกรรมในเซสชันกิจกรรมคุณจะได้รับข้อผิดพลาดนี้:

ข่าวสารเกี่ยวกับ 25639, ระดับ 16, สถานะ 23, บรรทัด 1 เหตุการณ์ "[ชื่อเหตุการณ์]" เกินจำนวนการดำเนินการที่ผูกไว้ที่อนุญาต

อนุญาตให้มีการกระทำกี่ครั้ง มันแตกต่างกันไปตามเหตุการณ์?

คำตอบขึ้นอยู่กับการทดลองดูเหมือนจะเป็น sqlserver.rpc_completed27 แต่ฉันไม่ได้พบหมายเลขบนใด ๆ ที่เอกสารไมโครซอฟท์ และดูเหมือนว่าจะแตกต่างกันไปจากเหตุการณ์ที่ผมก็สามารถที่จะได้รับ sqlserver.sql_batch_completed30

รหัสตัวอย่างที่ล้มเหลว:

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_nameและtype_sizeคอลัมน์ที่มีประโยชน์เพื่อดูว่าคุณกำลังเพิ่มจุดข้อมูลขนาดแปรผัน (ขนาด 0 ในภาพหน้าจอด้านล่าง)

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้คุณอาจกำลังคิด - ตกลงที่ดี แต่ฉันไม่รู้ขีด จำกัด ของเวทย์มนตร์ดังนั้นมันจึงไม่มีประโยชน์จริงๆ มันเป็นอย่างนั้นและมันก็ไม่ใช่ หากคุณมองมันโดยเฉพาะจากมุมมองตัวเลขแล้วใช่มันไม่มีประโยชน์มาก ... แต่นี่เป็นวิธีที่แย่มากในการมองมัน ควรจะดูว่า "ฉันรวบรวมเฉพาะข้อมูลที่ฉันต้องการหรือไม่" และในกรณีส่วนใหญ่คุณจะไม่พบปัญหากับข้อผิดพลาดนี้

หากเราใช้คำจำกัดความในคำถามที่ไม่ได้ผลข้อมูลบางอย่างที่เก็บรวบรวมดูเหมือนว่าไม่จำเป็นจริงๆ คุณต้องการ callstack, id เธรดปัจจุบัน, รอบเวลา cpu, ที่อยู่ของผู้ปฏิบัติงานและที่อยู่ของตัวกำหนดตารางเวลาหรือไม่? Callstack เป็นตัวแปรส่วนที่เหลือได้รับการแก้ไขดังนั้นเพียงแค่กำจัด callstack ที่คุณสามารถใส่ลงในคอลัมน์เพิ่มเติมได้ถ้าต้องการ ฉันไม่ได้บอกว่าคุณต้องการอะไรมากกว่านี้ แต่ทำได้

จุดรวมคือการจำกัดคำนิยามที่จะมีขนาดเล็กเป็นสิ่งจำเป็น การรวบรวมทุกอย่างจะส่งผลให้เกิดข้อผิดพลาด (อย่างที่คุณมีที่นี่) ความช้าของระบบข้อมูลมากเกินไปสำหรับการวิเคราะห์หรือแม้กระทั่งระบบหยุดทำงาน เพียงเพราะคุณไม่สามารถหมายความว่าคุณควร ไม่มีอะไรที่ระบุว่าขีด จำกัด เหล่านี้จะหรือไม่เปลี่ยนแปลงระหว่างรุ่นหลักหรือรุ่นรองดังนั้นการรักษาความต้องการขั้นต่ำที่แท้จริงคือการป้องกันที่ดีที่สุด โปรดอย่าทำเครื่องหมายทุกช่อง (gui) หรือเพิ่มทุกการกระทำเท่าที่จะทำได้


ฉันพบปัญหาที่คล้ายกันเมื่อเพิ่มกิจกรรมมากเกินไปในเซสชันเดียวเมื่อทดสอบเครื่องมือQueryableXEventDataที่ฉันกำลังพัฒนา การระบุเฉพาะกิจกรรมการกระทำและเขตข้อมูลที่จำเป็นจริง ๆ เท่านั้นคือคำแนะนำที่ดี
Dan Guzman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.