Database
 sql >> डेटाबेस >  >> RDS >> Database

कुंडी का परिचय

मेरे पिछले कुछ लेखों में प्रदर्शन ट्यूनिंग पर, मैंने कई प्रतीक्षा प्रकारों पर चर्चा की है और वे विभिन्न संसाधन बाधाओं का संकेत कैसे देते हैं। मैं उन परिदृश्यों पर एक नई श्रृंखला शुरू कर रहा हूं जहां एक सिंक्रनाइज़ेशन तंत्र जिसे एक कुंडी कहा जाता है, एक प्रदर्शन बाधा है, और विशेष रूप से गैर-पृष्ठ कुंडी। इस प्रारंभिक पोस्ट में मैं यह बताने जा रहा हूं कि कुंडी की आवश्यकता क्यों है, वे वास्तव में क्या हैं, और वे कैसे एक अड़चन हो सकते हैं।

कुंडी की आवश्यकता क्यों है?

यह कंप्यूटर विज्ञान का एक मूल सिद्धांत है कि जब भी एक बहु-थ्रेडेड सिस्टम में डेटा संरचना मौजूद होती है, तो डेटा संरचना को किसी तरह से संरक्षित किया जाना चाहिए। यह सुरक्षा निम्नलिखित प्रावधान देती है:

  1. (गारंटी) एक डेटा संरचना को एक थ्रेड द्वारा नहीं बदला जा सकता है जबकि दूसरा थ्रेड इसे पढ़ रहा है
  2. (गारंटी) एक डेटा संरचना को एक थ्रेड द्वारा नहीं पढ़ा जा सकता है जबकि दूसरा थ्रेड इसे बदल रहा है
  3. (गारंटीकृत) एक डेटा संरचना को एक ही समय में दो या दो से अधिक थ्रेड द्वारा नहीं बदला जा सकता है
  4. (वैकल्पिक) दो या दो से अधिक थ्रेड्स को एक ही समय में डेटा संरचना को पढ़ने की अनुमति दें
  5. (वैकल्पिक) डेटा संरचना तक पहुंच के लिए थ्रेड्स को क्रमबद्ध तरीके से कतार में आने दें

यह कई तरीकों से किया जा सकता है, जिनमें शामिल हैं:

  • एक तंत्र जो एक समय में केवल एक ही थ्रेड को डेटा संरचना तक किसी भी पहुंच की अनुमति देता है। SQL सर्वर इस तंत्र को लागू करता है और इसे स्पिनलॉक कहता है। यह ऊपर #1, #2, और #3 की अनुमति देता है।
  • एक तंत्र जो एक ही समय में कई थ्रेड्स को डेटा संरचना को पढ़ने की अनुमति देता है (यानी उनके पास साझा पहुंच है), एक एकल थ्रेड को डेटा संरचना (अन्य सभी थ्रेड्स के बहिष्करण के लिए) तक विशेष पहुंच प्राप्त करने की अनुमति देता है, और लागू करता है पहुंच के लिए कतार का एक उचित तरीका। SQL सर्वर इस तंत्र को लागू करता है और इसे एक कुंडी कहता है। यह उपरोक्त सभी पांच प्रावधानों की अनुमति देता है।

तो SQL सर्वर स्पिनलॉक्स और लैच दोनों का उपयोग क्यों करता है? कुछ डेटा संरचनाओं को इतनी बार एक्सेस किया जाता है कि एक कुंडी बहुत महंगी होती है और इसलिए इसके बजाय बहुत हल्के स्पिनलॉक का उपयोग किया जाता है। ऐसी डेटा संरचनाओं के दो उदाहरण हैं बफ़र पूल में मुफ़्त बफ़र्स की सूची और लॉक मैनेजर में ताले की सूची।

एक कुंडी क्या है?

लैच एक सिंक्रोनाइज़ेशन मैकेनिज्म है जो एकल डेटा संरचना की सुरक्षा करता है और SQL सर्वर में तीन व्यापक प्रकार के लैच हैं:

  1. डिस्क से पढ़े जा रहे डेटा फ़ाइल पृष्ठ की सुरक्षा करने वाली कुंडी। PAGEIOLATCH_XX प्रतीक्षा के रूप में ये दिखाई देते हैं, और मैंने इस पोस्ट में उनकी चर्चा की है।
  2. एक डेटा फ़ाइल पृष्ठ तक पहुंच की सुरक्षा करता है जो पहले से ही स्मृति में है (बफर पूल में एक 8KB पृष्ठ वास्तव में केवल एक डेटा संरचना है)। PAGELATCH_XX प्रतीक्षा के रूप में ये दिखाई देते हैं, और मैंने इस पोस्ट में उनकी चर्चा की है।
  3. गैर-पृष्ठ डेटा संरचनाओं की सुरक्षा करने वाले कुंडी। ये LATCH_SH और LATCH_EX प्रतीक्षा के रूप में दिखाई देते हैं।

इस श्रृंखला में, हम तीसरे प्रकार के कुंडी पर ध्यान केंद्रित करने जा रहे हैं।

एक कुंडी अपने आप में एक छोटी डेटा संरचना है और आप इसे तीन घटकों के रूप में सोच सकते हैं:

  • संसाधन का विवरण (यह किस चीज की रक्षा कर रहा है)
  • एक स्थिति फ़ील्ड इंगित करता है कि वर्तमान में कुंडी किस मोड में है, उस मोड में कितने धागे कुंडी को पकड़ते हैं, और क्या कोई थ्रेड प्रतीक्षा कर रहा है (साथ ही अन्य सामान जिनसे हमें चिंतित होने की आवश्यकता नहीं है)
  • थ्रेड्स की पहली-इन-फर्स्ट-आउट कतार जो डेटा संरचना तक पहुंच की प्रतीक्षा कर रही है, और वे किस एक्सेस के तरीके की प्रतीक्षा कर रहे हैं (जिसे प्रतीक्षा कतार कहा जाता है)

गैर-पृष्ठ लैच के लिए, हम केवल डेटा संरचना को पढ़ने के लिए एक्सेस मोड SH (शेयर) और डेटा संरचना को बदलने के लिए EX (अनन्य) पर विचार करने तक ही सीमित रहेंगे। अन्य अधिक आकर्षक तरीके हैं, लेकिन उनका उपयोग शायद ही कभी किया जाता है और वे विवाद बिंदुओं के रूप में प्रकट नहीं होंगे, इसलिए मैं दिखाऊंगा कि वे इस चर्चा के बाकी हिस्सों के लिए मौजूद नहीं हैं।

आप में से कुछ लोग जानते होंगे कि स्केलेबिलिटी के लिए सुपरलैच/सबलैच और लैच विभाजन के आसपास भी गहरी जटिलताएं हैं, लेकिन हमें इस श्रृंखला के प्रयोजनों के लिए उस गहराई तक जाने की आवश्यकता नहीं है।

एक कुंडी प्राप्त करना

जब कोई धागा कुंडी प्राप्त करना चाहता है, तो वह कुंडी की स्थिति को देखता है।

यदि थ्रेड EX मोड में लैच प्राप्त करना चाहता है, तो वह ऐसा तभी कर सकता है जब किसी भी मोड में लैच को पकड़े हुए थ्रेड्स न हों। यदि ऐसा है, तो थ्रेड EX मोड में लैच प्राप्त कर लेता है और इसे इंगित करने के लिए स्थिति सेट करता है। यदि एक या अधिक थ्रेड्स पहले से ही कुंडी को पकड़े हुए हैं, तो थ्रेड स्थिति को यह इंगित करने के लिए सेट करता है कि प्रतीक्षा करने वाला धागा है, प्रतीक्षा कतार के निचले भाग में प्रवेश करता है, और फिर निलंबित कर दिया जाता है (अनुसूचक की वेटर सूची पर यह चालू है) ) LATCH_EX की प्रतीक्षा कर रहा है।

यदि धागा एसएच मोड में कुंडी प्राप्त करना चाहता है, तो यह केवल तभी कर सकता है जब कोई धागा कुंडी नहीं रखता है या केवल कुंडी रखने वाले धागे एसएच मोड में हैं *और* कुंडी प्राप्त करने के लिए कोई धागा प्रतीक्षा नहीं कर रहा है। यदि ऐसा है, तो थ्रेड SH मोड में कुंडी प्राप्त कर लेता है, यह इंगित करने के लिए स्थिति सेट करता है, और कुंडी धारण करने वाले थ्रेड्स की संख्या में वृद्धि करता है। यदि लैच को EX मोड में रखा गया है या एक या अधिक प्रतीक्षा थ्रेड हैं, तो थ्रेड स्थिति को यह इंगित करने के लिए सेट करता है कि प्रतीक्षा थ्रेड है, प्रतीक्षा कतार के निचले भाग में प्रवेश करता है, और फिर LATCH_SH की प्रतीक्षा में निलंबित कर दिया जाता है।

EX मोड में लैच की प्रतीक्षा कर रहे थ्रेड की निष्पक्षता सुनिश्चित करने के लिए प्रतीक्षा थ्रेड्स की जांच की जाती है। इसे केवल एसएच मोड में कुंडी रखने वाले धागे की प्रतीक्षा करनी होगी, जिसने प्रतीक्षा शुरू करने से पहले कुंडी हासिल कर ली थी। उस जांच के बिना, 'भुखमरी' नामक एक कंप्यूटर विज्ञान शब्द हो सकता है, जब एसएच मोड में कुंडी प्राप्त करने वाले थ्रेड्स की एक निरंतर धारा EX-मोड थ्रेड को कभी भी कुंडी प्राप्त करने में सक्षम होने से रोकती है।

एक कुंडी जारी करना

यदि थ्रेड लैच को EX मोड में रखता है, तो यह स्थिति को अनसेट करता है कि लैच को EX मोड में रखा गया है और फिर यह देखने के लिए जाँच करता है कि क्या कोई प्रतीक्षा थ्रेड हैं।

यदि थ्रेड SH मोड में लैच रखता है, तो यह SH-मोड थ्रेड्स की संख्या घटाता है। यदि गिनती अब शून्य नहीं है, तो रिलीजिंग धागा कुंडी के साथ किया जाता है। अगर गिनती *है* अब शून्य है, तो यह स्थिति को अनसेट करता है कि कुंडी को एसएच मोड में रखा गया है और फिर यह देखने के लिए जांच करता है कि क्या कोई प्रतीक्षा धागा है या नहीं।

यदि कोई थ्रेड प्रतीक्षा नहीं कर रहा है, तो रिलीजिंग थ्रेड कुंडी के साथ किया जाता है।

यदि प्रतीक्षा कतार का प्रमुख EX मोड की प्रतीक्षा कर रहा है, तो रिलीज़ करने वाला थ्रेड निम्न कार्य करता है:

  • यह दिखाने के लिए स्थिति सेट करता है कि कुंडी EX मोड में है
  • प्रतीक्षा धागे को कतार के शीर्ष से हटाता है और इसे कुंडी के मालिक के रूप में सेट करता है
  • प्रतीक्षा थ्रेड को संकेत देता है कि यह स्वामी है और अब चलाने योग्य है (अवधारणात्मक रूप से, वेटिंग थ्रेड को इसके शेड्यूलर पर वेटर सूची से शेड्यूलर पर चलने योग्य कतार में ले जाकर)
  • और यह कुंडी के साथ किया गया है

यदि प्रतीक्षा कतार का प्रमुख एसएच मोड में प्रतीक्षा कर रहा है (जो केवल तभी हो सकता है जब रिलीजिंग थ्रेड EX मोड में हो), रिलीजिंग थ्रेड निम्न कार्य करता है:

  • यह दिखाने के लिए स्थिति सेट करता है कि कुंडी SH मोड में है
  • प्रतीक्षा कतार में सभी थ्रेड्स के लिए जो एसएच मोड की प्रतीक्षा कर रहे हैं
    • प्रतीक्षा सूत्र को कतार के शीर्ष से हटाता है
    • कुंडी पकड़ने वाले धागों की संख्या बढ़ाता है
    • प्रतीक्षा सूत्र को संकेत देता है कि यह एक स्वामी है और अब चलाने योग्य है
  • और यह कुंडी के साथ किया गया है

कुंडी विवाद का बिंदु कैसे हो सकती है?

ताले के विपरीत, कुंडी आमतौर पर केवल पढ़ने या बदलने के संचालन की अवधि के लिए आयोजित की जाती है, इसलिए वे बहुत हल्के होते हैं, लेकिन एसएच बनाम ईएक्स असंगति के कारण, वे ताले के रूप में एक विवाद बिंदु के रूप में बड़े हो सकते हैं। ऐसा तब हो सकता है जब कई थ्रेड्स सभी EX मोड में लैच प्राप्त करने का प्रयास कर रहे हों (एक बार में केवल एक ही हो सकता है) या जब कई थ्रेड्स SH मोड में लैच प्राप्त करने का प्रयास कर रहे हों और दूसरा थ्रेड EX मोड में लैच रखता हो।

सारांश

सिस्टम में जितने अधिक थ्रेड्स 'हॉट' लैच के लिए संघर्ष कर रहे हैं, विवाद उतना ही अधिक होगा और वर्कलोड थ्रूपुट पर प्रभाव उतना ही अधिक नकारात्मक होगा। उदाहरण के लिए, आपने प्रसिद्ध लैच विवाद मुद्दों के बारे में सुना होगा, उदाहरण के लिए, tempdb आवंटन बिटमैप्स के आसपास, लेकिन विवाद गैर-पृष्ठ लैच के लिए भी हो सकता है।

अब मैंने आपको लैच को समझने के लिए पर्याप्त पृष्ठभूमि दी है और वे कैसे काम करते हैं, अगले कुछ लेखों में मैं कुछ वास्तविक जीवन के गैर-पृष्ठ लैच विवाद मुद्दों की जांच करूंगा और समझाऊंगा कि उन्हें कैसे रोका जाए या उनके आसपास कैसे काम किया जाए।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अनुमानों पर ध्यान देना

  2. SQL में एक विदेशी कुंजी के साथ एक टेबल कैसे बनाएं

  3. IRI कार्यक्षेत्र से दूरस्थ नौकरियां कैसे चलाएं

  4. स्प्लिटिंग स्ट्रिंग्स :अब कम टी-एसक्यूएल के साथ

  5. टी-एसक्यूएल डेटाटाइम डेटा प्रकार