एक सेकंड से भी कम समय के लिए ब्लॉकिंग ट्रैक कैसे करें - SQL सर्वर


14

मैं एक अवरुद्ध मुद्दे का निवारण करने की कोशिश कर रहा हूं जो एक सेकंड से भी कम समय के लिए होता है। OLTP एप्लिकेशन बहुत संवेदनशील है और सहमत SLA के अनुसार कुछ लेन-देन के लिए 200ms से कम की प्रतिक्रिया समय है। नए कोड रिलीज़ के साथ हमारे पास कुछ लॉक एस्केलेशन मुद्दे थे, जिन्हें हम अपडेट में बैच आकार को कम करने के साथ हल करने में सक्षम थे। यहां तक ​​कि छोटे बैच आकार के साथ, हमें संदेह है कि नया एसपी उसी पंक्तियों को अवरुद्ध कर रहा है जो ओएलटीपी लेनदेन अपडेट कर रहा है।

मुझे उस सत्र को खोजने की आवश्यकता है जो अवरुद्ध हो रहा है और संसाधन इसकी प्रतीक्षा कर रहा है। मेरी समझ के अनुसार "अवरुद्ध प्रक्रिया थ्रेशोल्ड" न्यूनतम 1 सेकंड के लिए सेट कर सकता है और इसलिए यह ब्लॉकिंग पर कब्जा नहीं करेगा।

मैं Wait_info और Wait_completed x इवेंट्स के साथ प्रयोग कर रहा हूं।

क्या कोई और तरीका है जिससे हम इस पर नज़र रख सकें। धन्यवाद


एक ही उपयोगकर्ता द्वारा एक ही सवाल: 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 सर्वर त्रुटि लॉग के नीचे डंप करता है।

प्रक्रिया 53 ने RID: 2: 1: 120: 2 परिणाम: OKWAIT पर S लॉक के लिए 6844 ms प्रतीक्षा की

मैं सिर्फ इसका उल्लेख कर रहा हूँ क्योंकि विस्तारित घटनाओं को स्पष्ट रूप से बेहतर माना जा सकता है क्योंकि यह प्रलेखित है और बहुत अधिक शक्तिशाली है।


मैंने Locks_lock_waits का परीक्षण किया, और जैसा आपने कहा कि इसके पास संसाधन की जानकारी नहीं है। लेकिन मुझे नहीं पता था कि वेतन वृद्धि का समय था। अच्छी जानकारी dbcc लॉक, बहुत अच्छी लगती है। क्या आप जानते हैं कि त्रुटि लॉग में डालने से पहले वह जानकारी कितनी देर तक उपलब्ध है।
जेजेसेई

क्षमा करें, मैंने अपना आत्म स्पष्ट नहीं किया। मैं पूछ रहा था, जब तक हम dbcc लॉक कमांड चलाते हैं, तब तक हमारे पास क्या है। उदाहरण के लिए लॉकिंग होता है और अगर मैं एक घंटे के बाद dbcc लॉक चलाता हूं, तो क्या हमें अभी भी जानकारी मिलती है?
जेजेसेई

@jesijesi - मैंने आज से पहले ऐसा कभी नहीं सुना। मेरे पास इस पर और कोई जानकारी नहीं है। मैं इसे निष्क्रिय करने के लिए मापदंडों को भी नहीं जानता। लेकिन आप dbcc lock(StallReportThreshold, 200) पहले चलाते हैं और यह जानकारी को आउटपुट करता है जब तक कि थ्रेसहोल्ड को पार कर लिया जाता है जब तक कि ट्रेस फ्लैग 3605 इनेबल हो जाता है। SQL सर्वर इस जानकारी को सिर्फ उस स्थिति में एकत्रित नहीं करता है जब आप इसे बाद में चला सकते हैं।
मार्टिन स्मिथ

2
धन्यवाद। बस एक लिंक जोड़ने के लिए, जो कि xevents में रिसोर्स_0,1,2 मानों को परिवर्तित करने के लिए एक उपयोगी फ़ंक्शन है। sqlnotes.info/2011/10/24/…
jesijesi

5

यदि आप लॉकिंग में रुचि रखते हैं, तो कई विस्तारित कार्यक्रम उपलब्ध हैं:

lock_acquired
lock_released
lock_escalation

पहली दो घटनाओं durationमें (माइक्रोसेकंड) एक कॉलम होता है जिसे आप अपने थ्रेसहोल्ड के लिए फ़िल्टर कर सकते हैं। उनके पास एक 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

मुझे संदेह है कि शायद एक कारण है कि आप अवरुद्ध प्रक्रिया रिपोर्ट सीमा को एक सेकंड से भी कम समय तक सेट नहीं कर सकते: आरडीबीएमएस में लॉकिंग पूरी तरह से सामान्य है - उन्हें बचाने के लिए डेटाबेस इंजन को संसाधनों को लॉक करना पड़ता है। हालाँकि कोई आधिकारिक परिभाषा नहीं है कि जब लॉकिंग अवरुद्ध हो जाती है, तो उप-सेकंड पर लॉकिंग टिक करना, मुझे सामान्य लगता है।


1
जैसे ही किसी और को संसाधन तक पहुंचने से वंचित कर दिया जाता है, लॉक लॉक हो जाता है और लॉक के कारण रुकना पड़ता है।
मार्टिन स्मिथ

धन्यवाद, मैं अवधि क्षेत्र के साथ lock_acquired का उपयोग करने की योजना बना रहा हूं।
जेजेसेई

सौभाग्य। जब आप SQL सर्वर 2014 पर होते हैं, तो आप इन-मेमोरी ओएलटीपी तालिकाओं का उपयोग मूल रूप से संकलित संग्रहीत प्रोक्स के साथ कर सकते हैं जो एक उच्च प्रदर्शन कुंडी-मुक्त विकल्प प्रदान करते हैं। आप स्नैपशॉट अलगाव को भी देख सकते हैं।
२०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.