วิธีติดตามการบล็อกที่เกิดขึ้นน้อยกว่าหนึ่งวินาที - SQL Server


14

ฉันกำลังพยายามแก้ไขปัญหาการบล็อกซึ่งเกิดขึ้นน้อยกว่าหนึ่งวินาที แอปพลิเคชัน OLTP นั้นมีความละเอียดอ่อนมากและต้องมีเวลาตอบสนองน้อยกว่า 200ms สำหรับการทำธุรกรรมบางอย่างตาม SLA ที่ตกลงกันไว้ เรามีปัญหาการเพิ่มระดับการล็อคด้วยการเปิดตัวรหัสใหม่ซึ่งเราสามารถแก้ไขได้ด้วยการลดขนาดแบทช์ในการอัปเดต แม้ว่าจะมีขนาดเล็ก แต่เราสงสัยว่า sp ใหม่บล็อกแถวเดียวกันกับที่ธุรกรรม OLTP กำลังอัปเดต

ฉันต้องการค้นหาเซสชันที่กำลังถูกบล็อกและทรัพยากรกำลังรออยู่ ตามความเข้าใจของฉัน "เกณฑ์กระบวนการที่ถูกบล็อก" สามารถตั้งค่าได้อย่างน้อย 1 วินาทีและดังนั้นสิ่งนี้จะไม่จับการบล็อก

ฉันกำลังทดลองกับ wait_info และ wait_completed x events

มีวิธีอื่นที่เราสามารถติดตามสิ่งนี้ได้หรือไม่ ขอบคุณ


คำถามเดียวกันโดยผู้ใช้รายเดียวกัน: stackoverflow.com/questions/38407021/…
TheGameiswar

คำตอบ:


10

ในขณะที่คุณมีความสนใจเป็นพิเศษในการล็อคมากกว่าทั่วไปรอlocks_lock_waitsเหตุการณ์ขยายฟังดูเหมาะสมกว่า

ด้วยตัวกรองบน increment >= 200

CREATE EVENT SESSION [locks_lock_waits] ON SERVER 
ADD EVENT sqlserver.locks_lock_waits(
        ACTION(sqlserver.sql_text)
            WHERE  ( [sqlserver].[is_system] = 0
                     AND [increment] >= 200
                     AND [counter] <= 1000 ) 
    )
ADD TARGET package0.ring_buffer;

GO

ALTER EVENT SESSION [locks_lock_waits]  
ON SERVER  STATE = start;  

ข้างต้นรวบรวมคำสั่งที่รอการล็อคสำหรับจำนวนเวลาที่กำหนด แต่ไม่ได้ให้ทรัพยากรการล็อคที่เฉพาะเจาะจง

ฉันไม่เคยใช้กิจกรรมนี้และไม่เข้าใจเลยว่าเซสชันนี้จะมีค่าใช้จ่ายเท่าใดในเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ

ฉันพบวิดีโอนี้ในหัวข้อ แนะนำให้ใช้การกรองcounterเพื่อลดจำนวนกิจกรรมที่รวบรวมและฉันได้ทำตามขั้นตอนด้านบนแล้ว

นอกจากนี้ยังกล่าวถึงคำสั่งที่ไม่มีเอกสารเก่า

dbcc lock(StallReportThreshold, 200) -- 200 is threshold in ms

ซึ่ง (ถ้าเปิดใช้งานการตั้งค่าสถานะการสืบค้นกลับ 3605) ทิ้งข้อมูล จำกัด เช่นด้านล่างเพื่อบันทึกข้อผิดพลาดของ SQL Server

กระบวนการ 53 รอ 6844 ms สำหรับการล็อก S บน RID: 2: 1: 120: 2 ผลลัพธ์: OKWAIT

ฉันเพิ่งพูดถึงเรื่องนี้ในการผ่านเพราะกิจกรรมเพิ่มเติมจะดีกว่าอย่างชัดเจนต่อไปเพราะมันเป็นเอกสารและมีประสิทธิภาพมากขึ้น


ฉันทดสอบ locks_lock_waits และอย่างที่คุณบอกว่ามันไม่มีข้อมูลทรัพยากร แต่ฉันไม่รู้ว่าการเพิ่มขึ้นเป็นเวลา ล็อค dbcc ข้อมูลที่ดีดูดี คุณรู้หรือไม่ว่าข้อมูลนั้นมีอยู่นานเท่าใดก่อนที่จะถูกทิ้งลงในบันทึกข้อผิดพลาด
jesijesi

ขอโทษฉันไม่ได้ทำให้ตัวเองชัดเจน ฉันถามว่าเรามีเวลานานเท่าไหร่จนกว่าเราจะรันคำสั่ง dbcc lock เช่นการล็อคเกิดขึ้นและหากฉันรันการล็อค dbcc หลังจากผ่านไปหนึ่งชั่วโมงเราจะยังได้รับข้อมูลหรือไม่
jesijesi

@jesijesi - ฉันไม่เคยได้ยินมาก่อนวันนี้ ฉันไม่มีข้อมูลเพิ่มเติมอีกแล้ว ฉันไม่รู้ด้วยซ้ำว่าพารามิเตอร์จะผ่านเพื่อปิดใช้งาน แต่คุณเรียกใช้dbcc lock(StallReportThreshold, 200) ก่อนและจะแสดงผลข้อมูลเมื่อเกินเกณฑ์เมื่อเปิดใช้งานการตั้งค่าสถานะการสืบค้นกลับ 3605 SQL Server จะไม่รวบรวมข้อมูลนี้ในกรณีที่คุณอาจรันในภายหลัง
Martin Smith

2
ขอบคุณ เพียงแค่เพิ่มลิงค์ที่มีฟังก์ชั่นที่มีประโยชน์ในการแปลงค่า resource_0,1,2 เป็น xevents sqlnotes.info/2011/10/24/…
jesijesi

5

หากคุณสนใจที่จะล็อคมีหลายเหตุการณ์ที่ขยายให้บริการ:

lock_acquired
lock_released
lock_escalation

สองเหตุการณ์แรกมีdurationคอลัมน์เป็น(microseconds) ซึ่งคุณสามารถกรองสำหรับเกณฑ์ของคุณ พวกเขายังมีการresource_descriptionดำเนินการที่จะให้รายละเอียดบางอย่างเกี่ยวกับทรัพยากรที่เกี่ยวข้อง

lock_escalationเหตุการณ์นอกจากนี้ยังมีstatementการดำเนินการที่คุณสามารถเพิ่มการเก็บรวบรวมคำสั่ง T-SQL ที่เรียกเพิ่มล็อค escalation_causeนอกจากนี้ยังมี นี่คือตัวอย่างเซสชั่น:

CREATE EVENT SESSION [locking] ON SERVER 
ADD EVENT sqlserver.lock_acquired( SET collect_resource_description = (1) ),
ADD EVENT sqlserver.lock_escalation( SET collect_statement = (1) ),
ADD EVENT sqlserver.lock_released( SET collect_resource_description = (1) )
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

ฉันสงสัยว่าอาจเป็นเหตุผลที่คุณไม่สามารถตั้งค่าเกณฑ์การรายงานกระบวนการที่ถูกบล็อกให้น้อยกว่าหนึ่งวินาที: การล็อคเป็นเรื่องปกติอย่างสมบูรณ์ใน RDBMS - เอ็นจิ้นฐานข้อมูลต้องล็อคทรัพยากรเพื่อปกป้องพวกเขา แม้ว่าจะไม่มีคำจำกัดความเป็นทางการว่าเมื่อการล็อคกลายเป็นการปิดกั้นการล็อคไปทั่ววินาทีนั้นดูเหมือนจะเป็นเรื่องปกติสำหรับฉัน


1
การล็อคจะบล็อคทันทีที่คนอื่นถูกปฏิเสธการเข้าถึงทรัพยากรและต้องรอเนื่องจากการล็อค
Martin Smith

ขอบคุณฉันวางแผนที่จะใช้ lock_acquired กับฟิลด์ระยะเวลา
jesijesi

โชคดี. ในขณะที่คุณอยู่บน SQL Server 2014 คุณสามารถใช้ตาราง OLTP ในหน่วยความจำที่มีโพรเซสที่จัดเก็บแบบดั้งเดิมที่รวบรวมไว้ให้ตัวเลือกที่ไม่มี latch ประสิทธิภาพสูง คุณสามารถดูภาพแยกได้
wBob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.