2014 में वापस, मैंने विशिष्ट प्रतीक्षा प्रकारों और वे क्या करते हैं और क्या नहीं के बारे में बात करने के लिए यहां ब्लॉग पोस्ट की एक श्रृंखला शुरू की। इससे मुझे वेट एंड लैचेज लाइब्रेरी बनाने का विचार आया जो मैं बनाए रखता हूं (इन पर बाद में अधिक)।
यदि आप इसे पढ़ रहे हैं और सोच रहे हैं "वह किस बारे में बात कर रहा है?" तो यह पोस्ट आपके लिए है। मैं आपको प्रतीक्षा के आँकड़ों से परिचित कराने जा रहा हूँ और समझाता हूँ कि SQL सर्वर में कार्यभार के प्रदर्शन के समस्या निवारण के लिए वे कितने महत्वपूर्ण हैं।
शेड्यूलिंग
SQL सर्वर के आंतरिक कोड का निष्पादन थ्रेड्स . नामक तंत्र का उपयोग करके किया जाता है . प्रत्येक थ्रेड SQL सर्वर कोड निष्पादित कर सकता है, और जब कोई क्वेरी समानांतर में चलती है तो एकाधिक थ्रेड एक साथ समन्वयित होते हैं। SQL सर्वर के उपयोग के लिए उपलब्ध प्रोसेसर कोर की संख्या के आधार पर, SQL सर्वर प्रारंभ होने पर ये थ्रेड बनाए जाते हैं।
धागे एक अनुसूचक . पर रखे जाते हैं जब कोई क्वेरी शुरू होती है, तो प्रति प्रोसेसर कोर एक शेड्यूलर के साथ, और क्वेरी समाप्त होने तक उस शेड्यूलर को बंद न करें। एक अनुसूचक के तीन बुनियादी 'भाग' होते हैं:
- प्रोसेसर , जिसमें ठीक एक थ्रेड वर्तमान में कोड निष्पादित कर रहा है।
- वेटर सूची , जिसमें सभी धागे हैं जो मूल रूप से अटके हुए हैं, किसी विशेष संसाधन के उपलब्ध होने की प्रतीक्षा कर रहे हैं।
- चलाने योग्य कतार , जिसमें सभी थ्रेड हैं जो निष्पादित करने में सक्षम हैं लेकिन प्रोसेसर पर आने की प्रतीक्षा कर रहे हैं।
राज्य 1 से 2 से 3 से 1 तक थ्रेड संक्रमण, क्वेरी समाप्त होने तक चारों ओर और आसपास।
प्रतीक्षा करता है
हमारे दृष्टिकोण से, शेड्यूलिंग का सबसे दिलचस्प हिस्सा तब होता है जब किसी थ्रेड को जारी रखने से पहले किसी संसाधन के लिए प्रतीक्षा करनी पड़ती है। इसके कुछ उदाहरण हैं:
- एक थ्रेड को एक पेज पढ़ने की जरूरत है, और पेज मेमोरी में नहीं है, इसलिए थ्रेड एक एसिंक्रोनस भौतिक I/O जारी करता है और फिर I/O पूरा होने तक प्रोसेसर से बाहर इंतजार करना पड़ता है।
- एक थ्रेड को इसे पढ़ने के लिए एक पंक्ति पर एक शेयर लॉक प्राप्त करने की आवश्यकता होती है, लेकिन एक अन्य थ्रेड में पहले से ही एक परस्पर विरोधी अनन्य लॉक होता है जब वह पंक्ति को अपडेट कर रहा होता है।
जब कोई थ्रेड किसी ऐसे संसाधन की आवश्यकता का सामना करता है जिसे वह प्राप्त नहीं कर सकता है, तो उसके पास संसाधन के उपलब्ध होने की प्रतीक्षा करने और रुकने के अलावा कोई विकल्प नहीं होता है (संसाधन उपलब्धता के बारे में थ्रेड को कैसे अधिसूचित किया जाता है, इसके लिए तंत्र इस लेख के दायरे से बाहर है)। जब ऐसा होता है, तो SQL सर्वर नोट करता है कि थ्रेड को प्रतीक्षा क्यों करनी पड़ी और इसे प्रतीक्षा प्रकार कहा जाता है। . इसके कुछ उदाहरण हैं:
- जब कोई थ्रेड किसी पृष्ठ के स्मृति में पढ़ने की प्रतीक्षा कर रहा है ताकि उसे पढ़ा जा सके, तो प्रतीक्षा प्रकार PAGEIOLATCH_SH है (यदि थ्रेड किसी पृष्ठ की प्रतीक्षा कर रहा है कि वह बदल जाएगा, तो प्रतीक्षा प्रकार PAGEIOLATCH_EX है। )
- जब कोई थ्रेड किसी पंक्ति में शेयर लॉक की प्रतीक्षा करता है, तो प्रतीक्षा प्रकार LCK_M_S होता है (लॉक-मोड-शेयर)
SQL सर्वर यह भी ट्रैक करता है कि थ्रेड को कितने समय तक प्रतीक्षा करनी है। इसे संसाधन प्रतीक्षा समय . कहा जाता है , और आमतौर पर इसे प्रतीक्षा समय . के रूप में जाना जाता है ।
प्रतीक्षा आंकड़े
कितने थ्रेड ने किस संसाधन के लिए और औसतन कितने समय तक प्रतीक्षा की है, इसके मीट्रिक के समग्र सेट को प्रतीक्षा आंकड़े कहा जाता है . यह जानकारी कार्यभार प्रदर्शन के समस्या निवारण के लिए अत्यंत उपयोगी है, क्योंकि आप आसानी से देख सकते हैं कि प्रदर्शन की बाधाएं कहां हो सकती हैं।
मूल विचार यह है कि SQL सर्वर के पास इस बात की जानकारी है कि थ्रेड्स को क्यों रुकना और प्रतीक्षा करना है, और वे किस चीज़ की प्रतीक्षा कर रहे हैं। इसलिए यह अनुमान लगाने के बजाय कि समस्या निवारण कहां से शुरू करना है, प्रतीक्षा के आंकड़ों का सावधानीपूर्वक विश्लेषण आमतौर पर आपको एक दिशा में ले जाने की ओर इशारा कर सकता है।
उदाहरण के लिए, यदि सर्वर पर अधिकांश प्रतीक्षाएँ PAGEIOLATCH_SH हैं , यह संकेत दे सकता है कि सर्वर पर स्मृति दबाव है, या गैर-संकुल अनुक्रमणिका का उपयोग करने के बजाय बड़ी तालिका स्कैन करने वाली क्वेरी हैं, या यह कि अंतर्निहित I/O सबसिस्टम के साथ कोई समस्या है, या कई अन्य कारण हैं।पी>
बड़ी संख्या में प्रतीक्षा प्रकार होते हैं, लेकिन उनमें से अधिकांश बहुत बार क्रॉप नहीं होते हैं, इसलिए एक कोर सेट है जिसे आप अपने सर्वर पर बार-बार देखेंगे। यह समझना कि इनका क्या मतलब है और उनकी जांच कैसे करें, यह महत्वपूर्ण है ताकि आप 'घुटने-झटके प्रदर्शन ट्यूनिंग' के आगे न झुकें और एक ऐसी समस्या को ठीक करने की कोशिश में समय और प्रयास बर्बाद करें जो वास्तव में कोई समस्या नहीं है। मैंने यहां ब्लॉग पोस्ट की एक श्रृंखला लिखी है जो वहां विवरण में जाती है, और हारून बर्ट्रेंड ने पिछले साल शीर्ष 10 प्रतीक्षा आंकड़ों का एक सारांश पोस्ट भी लिखा था।
ट्रैकिंग प्रतीक्षा
ऐसे कई तरीके हैं जिनसे आप प्रतीक्षा को ट्रैक कर सकते हैं। सबसे आसान यह है कि sys.dm_os_waiting_tasks की जांच करने वाली स्क्रिप्ट का उपयोग करके सर्वर पर अभी क्या प्रतीक्षा हो रही है, यह देखना आसान है। डीएमवी। आप यहां ऐसा करने के लिए एक स्क्रिप्ट पा सकते हैं, और इसमें प्रतीक्षा पुस्तकालय में स्वतः उत्पन्न यूआरएल हैं।
दूसरा तरीका यह है कि sys.dm_os_wait_stats की जांच करने वाली स्क्रिप्ट के साथ पूरे सर्वर के लिए कुल प्रतीक्षा आंकड़ों को देखा जाए। डीएमवी। आप यहां ऐसा करने के लिए एक स्क्रिप्ट पा सकते हैं, और इसमें प्रतीक्षा पुस्तकालय में स्वत:जेनरेट किए गए यूआरएल हैं। हालाँकि आपको उस पद्धति से सावधान रहने की आवश्यकता है, क्योंकि यह सर्वर के शुरू होने के बाद से हुई सभी प्रतीक्षाओं को दिखाएगा। एक बेहतर तरीका यह है कि छोटे अंतरालों पर प्रतीक्षा को ट्रैक किया जाए, जैसे कि आधा घंटा, और ऐसा करने के लिए एक स्क्रिप्ट यहां दी गई है।
आप नए Azure डेटा स्टूडियो टूल में सर्वर रिपोर्ट ऐड-इन का उपयोग करके और SQL सर्वर 2017 से क्वेरी स्टोर का उपयोग करके प्रतीक्षा के आंकड़े भी प्राप्त कर सकते हैं।
याद रखें, मीट्रिक एकत्र करने के बाद आपको अभी भी यह समझना होगा कि प्रतीक्षा प्रकारों का क्या अर्थ है।
संसाधनों की प्रतीक्षा कर रहा है
इसके साथ मदद करने के लिए, और क्योंकि Microsoft के पास प्रतीक्षा आंकड़ों की व्याख्या करने के तरीके पर दस्तावेज़ नहीं है, 2016 में मैंने एक प्रतीक्षा प्रकार की लाइब्रेरी जारी की, जिसमें सैकड़ों सामान्य प्रतीक्षा प्रकारों का विवरण और उनका निवारण कैसे किया जाए। आप पुस्तकालय में https://www.SQLskills.com/help/waits पर जा सकते हैं। और फिर 2017 में, SentryOne ने लाइब्रेरी में प्रत्येक पृष्ठ के लिए एक इन्फोग्राफिक प्रदान करने के लिए एक स्वचालित प्रणाली बनाई, जिसका उपयोग आप यह देखने के लिए कर सकते हैं कि आप जिस प्रतीक्षा प्रकार में रुचि रखते हैं वह वास्तव में सामान्य है या नहीं (विवरण के लिए यह पोस्ट देखें) . PAGEIOLATCH_SH . के लिए एक उदाहरण इन्फोग्राफिक नीचे है प्रतीक्षा प्रकार:
क्षैतिज अक्ष पर एक पैमाना है (रैखिक और लघुगणक के बीच स्विच करने योग्य) कितने प्रतिशत उदाहरणों (SentryOne द्वारा दूर से निगरानी) ने पिछले कैलेंडर महीने में इस प्रतीक्षा का अनुभव किया, और ऊर्ध्वाधर अक्ष पर उस समय का प्रतिशत है जो उन उदाहरणों का अनुभव करता है प्रतीक्षा करें वास्तव में उस प्रतीक्षा प्रकार की प्रतीक्षा में एक धागा था।
प्रतीक्षा को समझने में आपकी सहायता करने के लिए एक अन्य संसाधन एक ऑनलाइन प्रशिक्षण पाठ्यक्रम है जिसे मैंने प्लूरलसाइट के लिए रिकॉर्ड किया है - यहां देखें।
कम से कम, आपको ऊपर प्रतीक्षा सांख्यिकी और ट्रैकिंग प्रतीक्षा अनुभागों में विभिन्न ब्लॉग पोस्टों को पढ़ना चाहिए।
SentryOne Tools का उपयोग करके प्रतीक्षा को ट्रैक करना
SQL संतरी समय के साथ स्वचालित रूप से आपके लिए इंस्टेंस-लेवल की प्रतीक्षा करता है, इसलिए आपको "एक्ट में" उच्च प्रतीक्षा करने की आवश्यकता नहीं है। किसी ने कल दोपहर एक सुस्त प्रणाली के बारे में शिकायत की या एक रिपोर्ट जो पिछले मंगलवार को समाप्त हो गई थी? कोई बात नहीं। आप किसी भी समय या एक सीमा के लिए सभी प्रतीक्षाओं में खुदाई कर सकते हैं, और उन्हें उस समय एकत्र किए गए विभिन्न अन्य प्रदर्शन मीट्रिक के साथ सहसंबंधित कर सकते हैं - चाहे वह डैशबोर्ड पर अन्य रुझान हों, जैसे बैकअप या डेटाबेस I/O गतिविधि, सभी के लिए कूदना शीर्ष SQL कमांड जो एक ही विंडो में चल रहे थे, लंबे समय से चल रहे अवरोधन की जांच कर रहे थे, या प्रतीक्षा प्रोफ़ाइल की अन्य अवधियों से तुलना करने के लिए बेसलाइन का उपयोग करते हैं।
आप उन प्रतीक्षाओं को भी अनुकूलित कर सकते हैं जो एकत्र की गई हैं या नहीं हैं, उन श्रेणियों को बदल सकते हैं जो नेत्रहीन रूप से प्रस्तुत की जाती हैं, और विशिष्ट प्रतीक्षा परिदृश्यों के लिए बुद्धिमान चेतावनी और / या प्रतिक्रियाएँ बना सकते हैं। हमारे कई ग्राहक प्रतीक्षा से संबंधित वास्तविक प्रदर्शन के मुद्दों पर ध्यान केंद्रित करने के लिए SQL संतरी का उपयोग करते हैं, क्योंकि यह उन्हें बहुत सारे शोर को अनदेखा करने की अनुमति देता है जो कि सामान्य SQL सर्वर थ्रेड गतिविधि है।
सारांश
जैसा कि आप ऊपर दी गई जानकारी से देख सकते हैं, प्रतीक्षा हमेशा SQL सर्वर में होती है, क्योंकि थ्रेड शेड्यूलिंग और मल्टी-थ्रेडेड सिस्टम इसी तरह काम करते हैं। वे आपके समस्या निवारण टूलबॉक्स में सबसे शक्तिशाली टूल में से एक हैं, इसलिए यदि आप पहले से उनका उपयोग नहीं कर रहे हैं, तो अब शुरू करने का समय है। सीखने की अवस्था छोटी और खड़ी है - एक बार जब आप विभिन्न प्रश्नों और उपकरणों को कई बार चला लेते हैं, तो आप इसे जल्दी से समझ लेंगे, और फिर यह आपके द्वारा देखे जा रहे प्रतीक्षा के लिए गाइड के माध्यम से पढ़ने का मामला है। यह निर्धारित करना कि क्या वे समस्या नहीं हैं।
समस्या निवारण के लिए शुभकामनाएँ!