Microsoft SQL Server मेमोरी प्रबंधन के मामले में बहुत स्मार्ट है, लेकिन कभी-कभी मेमोरी प्रेशर अलर्ट और डेटाबेस इंजन अधिक मेमोरी की मांग करते हैं, जिससे त्रुटियाँ होती हैं।
परिचय
यह पोस्ट उन असाधारण परिदृश्यों में से एक को हल करने पर चर्चा करता है जो SQL Server® 2019 (एंटरप्राइज़ संस्करण) पर मेमोरी-ऑप्टिमाइज़्ड टेबल्स (इन-मेमोरी OLTP) के कारण मेमोरी प्रेशर की वजह से आपको अनुभव हो सकते हैं। यही चरण SQL Server 2014 और बाद के संस्करणों पर भी लागू होते हैं।
आपको अपनी स्क्रीन पर निम्न त्रुटि संदेश दिखाई दे सकते हैं:
संदेश: Windows पर MSSQL: चोरी की गई सर्वर मेमोरी बहुत अधिक है स्रोत: XXXXX\MSSQLSERVER पथ: मौजूद नहीं अलर्ट विवरण: कंप्यूटर "XXXXXXX.XXX.com" पर SQL इंस्टेंस "MSSQLSERVER" की चोरी की गई सर्वर मेमोरी बहुत अधिक है। संदेश: SQL Server अलर्ट सिस्टम: '\\XXXXXXX' पर 'गंभीरता 17' हुई विवरण: संसाधन पूल 'internal' में इस क्वेरी को चलाने के लिए अपर्याप्त सिस्टम मेमोरी है। संदेश: संसाधन पूल 'default' में अपर्याप्त मेमोरी के कारण डेटाबेस 'InMemoryDB' के लिए पेज आवंटन अस्वीकृत। अधिक जानकारी के लिए 'https://go.microsoft.com/fwlink/?LinkId=510837' देखें। संदेश: मेमोरी प्रेशर के कारण XTP पेज आवंटन विफल: FAIL_PAGE_ALLOCATION 32
समाधान
इस समस्या के निवारण और समाधान के लिए निम्न चरण निष्पादित करें:
चरण एक
पहला चरण SQL बफर पूल में मेमोरी खपत की जांच करना है।
जैसा कि आप पूर्ववर्ती छवि से देख सकते हैं, प्रश्नाधीन डेटाबेस InMemoryDB, बफर पूल का केवल 0.017% उपभोग करता है।
चरण दो
फिर आप निम्न T-SQL कमांड का उपयोग करके OS मेमोरी क्लर्क्स की जांच करते हैं:
select * from sys.dm_os_memory_clerks order by pages_kb desc
परिणाम दिखाते हैं कि शीर्ष उपभोक्ताओं का कुल, कुल अधिकतम सर्वर मेमोरी का लगभग 80% था।
मेमोरी-ऑप्टिमाइज़्ड टेबल्स का आकार भी 2 GB से कम है, जिसे आप पूर्ववर्ती छवि में नाम DB_ID_6 के लिए देख सकते हैं। इस प्रकार, आदर्श रूप से सर्वर पर कोई मेमोरी प्रेशर नहीं होना चाहिए।
चरण तीन
त्रुटि लॉग में उल्लिखित आउट-ऑफ-मेमोरी (OOM) लिंक की समीक्षा करने के बाद, https://go.microsoft.com/fwlink/?LinkId=510837, आपको मेमोरी-ऑप्टिमाइज़्ड टेबल्स वाले डेटाबेस को एक संसाधन पूल से बांधने की आवश्यकता है। यह बाइंडिंग मेमोरी-ऑप्टिमाइज़्ड टेबल्स वाले डेटाबेस के लिए एक सर्वोत्तम अभ्यास है। संसाधन गवर्नर में एक संसाधन पूल बनाने और डेटाबेस को बांधने के चरणों का पालन करें।
सर्वोत्तम अभ्यास यह अनुशंसा करते हैं कि आप SQL Server को एक या अधिक मेमोरी-ऑप्टिमाइज़्ड टेबल्स द्वारा अपने संसाधनों का उपभोग करने से बचाएं और अन्य मेमोरी उपयोगकर्ताओं को मेमोरी-ऑप्टिमाइज़्ड टेबल्स के लिए आवश्यक मेमोरी का उपभोग करने से रोकें। इसलिए, आपको मेमोरी-ऑप्टिमाइज़्ड टेबल्स वाले डेटाबेस के लिए मेमोरी खपत प्रबंधित करने के लिए एक अलग संसाधन पूल बनाना चाहिए।
डेटाबेस को संसाधन पूल में जोड़ते समय निम्न बिंदुओं को ध्यान में रखें:
- आप एक डेटाबेस को केवल एक संसाधन पूल से बांध सकते हैं।
- आप एक ही पूल में कई डेटाबेस बांध सकते हैं।
- SQL Server बिना मेमोरी-ऑप्टिमाइज़्ड टेबल्स वाले डेटाबेस को संसाधन पूल से बांधने में सक्षम बनाता है, लेकिन इसका कोई प्रभाव नहीं पड़ता।
- आप संसाधन पूल से बांधने के बाद डेटाबेस में मेमोरी-ऑप्टिमाइज़्ड टेबल्स बना सकते हैं।
संसाधन पूल से बांधने के चरण
-
मेमोरी आवंटन के साथ संसाधन पूल बनाएं:
USE [master] GO CREATE RESOURCE POOL [Admin_Pool] WITH(min_cpu_percent=0, max_cpu_percent=100, min_memory_percent=15, max_memory_percent=15, cap_cpu_percent=100, AFFINITY SCHEDULER = AUTO, min_iops_per_volume=0, max_iops_per_volume=0) GOनोट: आउट-ऑफ-मेमोरी स्थितियों से बचने के लिए, min_memory_percent और max_memory_percent के मान समान होने चाहिए।
इस मामले में, मेमोरी-ऑप्टिमाइज़्ड टेबल्स बहुत छोटी हैं, कुल सर्वर मेमोरी का 15% संसाधन पूल को आवंटित किया गया है। अपने वातावरण में मेमोरी का प्रतिशत गणना करने के लिए संदर्भों में लिंक का उपयोग करना न भूलें।
-
संसाधन पूल को सत्यापित करें और डेटाबेस को इससे बांधें:
EXEC sp_xtp_bind_db_resource_pool 'InMemoryDB', 'Admin_Pool' GO -
sys.databases में बाइंडिंग सत्यापित करें:
SELECT d.database_id, d.name, d.resource_pool_id FROM sys.databases d GO
-
बाइंडिंग को सक्रिय करने के लिए डेटाबेस को पुनरारंभ करें:
ALTER DATABASE DB_Name SET OFFLINE GO ALTER DATABASE DB_Name SET ONLINE GO
नोट: यदि डेटाबेस ऑलवेज ऑन है, तो दोनों नोड्स पर चरण निष्पादित करें, और चरण 4 (डेटाबेस पुनरारंभ) के बजाय, द्वितीयक इंस्टेंस पर डेटाबेस फेलओवर करें।
निष्कर्ष
इस मामले में, मेमोरी-ऑप्टिमाइज़्ड टेबल्स वाले डेटाबेस को संसाधन पूल में जोड़ने के बाद मेमोरी प्रेशर से संबंधित सभी अलर्ट बंद हो गए। मैंने इस विशेष मुद्दे के लिए कुछ हफ्तों तक SQL Server त्रुटि लॉग की निगरानी की, और मेमोरी प्रेशर का कोई निशान नहीं था। इन चरणों ने न्यूनतम डाउनटाइम के साथ डेटाबेस इंजन स्तर पर मेमोरी प्रेशर को ठीक करने में मदद की।
कोई टिप्पणी करने या प्रश्न पूछने के लिए फीडबैक टैब का उपयोग करें। आप हमसे बातचीत भी शुरू कर सकते हैं।