SQL सर्वर के लिए उपलब्ध भौतिक मेमोरी नहीं होने पर क्या होता है?


16

गुग्लिंग करते समय मुझे कुछ परस्पर विरोधी जानकारी मिली।

कुछ साइटें बताती हैं कि जब डेटा के लिए कोई भौतिक मेमोरी नहीं बचती है, तो SQL सर्वर TEMPDB में पहले से मौजूद डेटा को स्थानांतरित करता है (देखें: SQL सर्वर: TempDb और अनुशंसाओं को नष्ट कर रहा है )।

लेकिन अन्य साइटें बताती हैं कि जब पर्याप्त भौतिक मेमोरी नहीं बची होती है, तो ऑपरेटिंग सिस्टम पेज फाइल का उपयोग कर सकता है और भौतिक मेमोरी से डेटा को इसमें स्थानांतरित कर सकता है ( SQL सर्वर के लिए पेज फ़ाइल देखें )।

मुझे आश्चर्य है कि जहां SQL सर्वर डेटा को भौतिक मेमोरी से बाहर चलाता है? Tempdb या OS पेज फ़ाइल के लिए? या शायद दोनों?

जवाबों:


28

जब डेटा के लिए कोई भौतिक मेमोरी नहीं बचती है, तो SQL सर्वर TEMPDB में पहले से मौजूद डेटा को स्थानांतरित करता है

आपके द्वारा जोड़ा गया लेख कुछ स्थानों पर सबसे अच्छा और गलत है। मुझे लगता है कि लेखक कुछ जटिल चीजों को अधिक सरल बनाने का प्रयास कर रहा था, और ऐसा करने में बहुत दूर चला गया।

SQL सर्वर उस तरह से tempdb में मेमोरी (बफर पूल) से डेटा को स्थानांतरित नहीं करता है। यह "कम से कम हाल ही में उपयोग की गई" कैशिंग रणनीति (सामान्य रूप से) का उपयोग करता है, इसलिए यदि मेमोरी दबाव है, और नए डेटा को मेमोरी में खींचने की आवश्यकता है, तो SQL सर्वर नए डेटा को समायोजित करने के लिए बफर पूल से LRU डेटा को बाहर निकाल देगा। इस व्यवहार की निगरानी अक्सर "पृष्ठ जीवन प्रत्याशा" (PLE) नामक परफ़ॉर्म काउंटर द्वारा की जाती है :

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

क्वेरी निष्पादन के दौरान, SQL सर्वर कुछ कार्यों के लिए tempdb का उपयोग कर सकता है । यह आमतौर पर किया जाता है यदि अनुमान खराब हैं, लेकिन कम उपलब्ध स्मृति इस व्यवहार को प्रभावित कर सकती है।

कुछ ऑपरेशन जो इस तरह से tempdb को "स्पिल" कर सकते हैं उनमें हैशिंग रो (जोड़ या एग्रीगेट, आदि के लिए), मेमोरी में पंक्तियों को छांटना और समानांतर क्वेरी निष्पादन के दौरान बफ़रिंग पंक्तियाँ हैं।

उपयोगकर्ता प्रश्न भी स्पष्ट रूप से tempdb (वैश्विक या स्थानीय अस्थायी तालिकाओं के साथ) का उपयोग कर सकते हैं, और अस्थायी रूप से tempdb (स्नैपशॉट के साथ या प्रतिबद्ध स्नैपशॉट अलगाव स्तर पढ़ सकते हैं) का उपयोग कर सकते हैं।

इन स्थितियों में से कोई भी वास्तव में आपके द्वारा उद्धृत कथन के लायक नहीं लगता है।

जब पर्याप्त भौतिक मेमोरी नहीं बची है, तो ऑपरेटिंग सिस्टम पेज फाइल का उपयोग कर सकता है और भौतिक मेमोरी से डेटा को स्थानांतरित कर सकता है

यह निश्चित रूप से हो सकता है, और अधिकांश भाग के लिए SQL सर्वर के नियंत्रण से बाहर है। एक नॉब है जिसे आप कुछ प्रकार के OS-लेवल पेजिंग को रोकने की कोशिश कर सकते हैं, जिसका नाम है "Lock Pages in Memory" (LPIM) :

यह विंडोज पॉलिसी यह निर्धारित करती है कि कौन से खाते भौतिक मेमोरी में डेटा रखने के लिए एक प्रक्रिया का उपयोग कर सकते हैं, सिस्टम को डिस्क पर वर्चुअल मेमोरी में डेटा को पेजिंग करने से रोक सकते हैं।

तो हम डिस्क में पेज होने से क्या रोक सकते हैं?

SQL सर्वर 2012 से पहले, "सिंगल पेज एलोकेटर" नामक एक घटक के माध्यम से आवंटित किए गए पृष्ठों को मेमोरी में बंद कर दिया गया था (जिसका मंचन नहीं किया जा सकता था)। इसमें बफर पूल (डेटाबेस पेज), प्रक्रिया कैश और स्मृति के कुछ अन्य क्षेत्र शामिल थे।

लॉक किए गए पृष्ठों के साथ मज़ा देखें , AWE, टास्क मैनेजर, और वर्किंग सेट ... विवरण के लिए, विशेष रूप से अनुभाग "4. अब मुझे पता है कि x64 पर SQL सर्वर" लॉक किए गए पृष्ठ "का उपयोग कर सकता है, वास्तव में क्या लॉक है?" अतिरिक्त संबंधित रीडिंग यहां पाई जा सकती है: ग्रेट SQL सर्वर डिबेट: मेमोरी में लॉक पेज

SQL सर्वर 2012 और बाद में, कोई "सिंगल पेज एलोकेटर" नहीं है (एकल और मल्टी-पेज एलोकेटर्स को मर्ज किया गया था, प्रति मेमोरी में गहराई से देखें - SQL सर्वर 2012/2014 )। क्या, वास्तव में, क्या और क्या नहीं देखा जा सकता है, इसका विवरण विस्तार से कहीं भी नहीं है जो मैंने देखा है। आप एक प्रश्न का उपयोग कर सकते इस तरह देखने के लिए क्या कर रहा है बंद कर दिया:

select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'

उसी एमएस सपोर्ट लेख के अनुसार, आप यह DBCC MEMORYSTATUSदेखने के लिए भी उपयोग कर सकते हैं कि मेमोरी कितनी "लॉक" है।

एक साइड नोट के रूप में, आप SQL सर्वर के कार्य सेट के सबूत को ओएस द्वारा त्रुटि लॉग में देखे जाने के प्रमाण में देख सकते हैं। इस तरह दिखने वाले संदेश होंगे:

2019-09-02 10: 19: 27.29 spid11s एसक्यूएल सर्वर प्रक्रिया मेमोरी का एक महत्वपूर्ण हिस्सा बाहर पृष्ठांकित किया गया है। इसके परिणामस्वरूप प्रदर्शन में गिरावट आ सकती है। अवधि: 329 सेकंड। कार्य सेट (KB): 68780, प्रतिबद्ध (KB): 244052, मेमोरी उपयोग: 28%।


0

SQL सर्वर के आधुनिक संस्करणों में पूरी तरह से लटकने की बहुत कम संभावना है। SQL सर्वर अपने पता स्थान में .NET फ्रेमवर्क लोड करता है और सामान्य ऑपरेशन के तहत इसका उपयोग करता है। यदि भौतिक मेमोरी और पेज फ़ाइल दोनों रन आउट हो जाती हैं, तो विंडोज पेज फाइल को बढ़ने की कोशिश करेगा; हालाँकि, भले ही यह पृष्ठ फ़ाइल को विकसित कर सकता है, यह एक तात्कालिक संचालन नहीं है, और पृष्ठ फ़ाइल बढ़ने के दौरान मेमोरी आवंटन विफल हो जाता है। .NET असिंक्रोनस I / O हैंडलर में एक बग है जहां यह APC अधिसूचना के जवाब में मेमोरी आवंटित करता है। यदि कॉल newविफल हो जाता है, तो इसे फेंक दिया जाएगाOutOfMemoryException। यह अपवाद कार्य शेड्यूलर के अंदर मूल कोड में पकड़ा गया है; हालाँकि एसिंक्रोनस I / O कभी खत्म नहीं होगा। FileStream के लिए अंतिम धागा I / O के समाप्त होने के इंतजार में अवरुद्ध हो जाएगा, इसलिए यह बफर को अनपिन कर सकता है, इस प्रकार अंतिम धागा को हमेशा के लिए लटका सकता है। यह .NET फ्रेमवर्क धीरे-धीरे अधिक से अधिक मेमोरी का उपयोग करने का कारण बनता है जब तक कि अधिक मेमोरी आवंटित नहीं की जा सकती है, जिस बिंदु पर एसक्यूएल सर्वर अप्रतिसादी होगा, क्योंकि वाइनस्कॉक अब बफ़र्स आवंटित नहीं कर सकता है, यहां तक ​​कि व्यवस्थापक एक्सेस कनेक्शन बेकार है।

मैंने वास्तव में एक कार्य अनुसूचक को मेमोरी से बाहर चलाने के कारण .NET अनुप्रयोग में कुल हैंगअप मारा है। शुक्र है कि प्रक्रिया अंत में OutOfMemoryExceptionकुछ धागे पर फेंकने के कारण मर गई जो कि कई विफलताओं के बाद इसे पकड़ नहीं पाई ताकि हम यह पता लगा सकें कि वास्तव में सर्वर को क्या लटका हुआ था।

एक बार जब मैं जानता था कि मैं क्या देख रहा था, स्थैतिक विश्लेषण में बग को ढूंढना आसान था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.