मेमोरी प्रबंधन के मामले में Microsoft SQL सर्वर बहुत स्मार्ट है, लेकिन कभी-कभी मेमोरी प्रेशर अलर्ट और डेटाबेस इंजन अधिक मेमोरी की मांग करते हैं, जिससे त्रुटियां होती हैं।
परिचय
यह पोस्ट चर्चा करती है कि SQL Server® 2019 (एंटरप्राइज़ संस्करण) पर मेमोरी-ऑप्टिमाइज़्ड टेबल्स (इन-मेमोरी ऑनलाइन ट्रांजेक्शन प्रोसेसिंग (OLTP)) के कारण होने वाले मेमोरी प्रेशर के कारण आपके द्वारा अनुभव किए जा सकने वाले असाधारण परिदृश्यों में से एक को कैसे हल किया जाए। SQL सर्वर 2014 और बाद के संस्करणों पर भी यही चरण लागू होते हैं।
आपको अपनी स्क्रीन पर निम्न त्रुटि संदेश फ्लैश होते दिखाई दे सकते हैं:
Message: MSSQL on Windows: Stolen Server Memory is too high
Source: XXXXX\MSSQLSERVER Path: Not Present Alert
description: SQL instance "MSSQLSERVER" Stolen Server Memory on
computer "XXXXXXX.XXX.com" is too high.
Message: SQL Server Alert System: 'Severity 17' occurred on \\XXXXXXX
DESCRIPTION: There is insufficient system memory in resource pool 'internal'
to run this query.
Message: Disallowing page allocations for database 'InMemoryDB' due to
insufficient memory in the resource pool 'default'. See
'https://go.microsoft.com/fwlink/?LinkId=510837' for more information.
Message: XTP failed page allocation due to memory pressure: 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 जीबी से कम है, जिसे आप DB_ID_6 नाम के लिए पिछली छवि में देख सकते हैं। . जैसे, आदर्श रूप से, सर्वर पर कोई स्मृति दबाव नहीं होना चाहिए।
तीसरा चरण
त्रुटि लॉग में उल्लिखित आउट ऑफ़ मेमोरी (OOM) लिंक की समीक्षा करने के बाद,https://go.microsoft.com/fwlink/?LinkId=510837 , आपको डेटाबेस को स्मृति-अनुकूलित तालिकाओं के साथ संसाधन पूल में बाध्य करने की आवश्यकता है। यह बाध्यकारी स्मृति-अनुकूलित तालिकाओं वाले डेटाबेस के लिए सर्वोत्तम अभ्यास है। रिसोर्स गवर्नर में रिसोर्सपूल बनाने और डेटाबेस को बाइंड करने के लिए चरणों का पालन करें।
सर्वोत्तम अभ्यास अनुशंसा करते हैं कि आप SQL सर्वर को इसके संसाधनों को एक या अधिक स्मृति-अनुकूलित तालिकाओं द्वारा उपभोग करने से बचाएं और अन्य स्मृति उपयोगकर्ताओं को स्मृति-अनुकूलित तालिकाओं द्वारा आवश्यक स्मृति का उपभोग करने से रोकें। इसलिए, आपको स्मृति-अनुकूलित तालिकाओं के साथ डेटाबेस के लिए स्मृति खपत को प्रबंधित करने के लिए एक अलग संसाधन पूल बनाना चाहिए।
संसाधन पूल में डेटाबेस जोड़ते समय निम्नलिखित बातों का ध्यान रखें:
- आप डेटाबेस को केवल एक संसाधन पूल पर बाँध सकते हैं।
- आप एक ही पूल में कई डेटाबेस को बाइंड कर सकते हैं।
- SQL सर्वर मेमोरी-अनुकूलित तालिकाओं के बिना डेटाबेस को संसाधन पूल में बाँधने में सक्षम बनाता है, लेकिन इसका कोई प्रभाव नहीं पड़ता है।
- आप डेटाबेस में मेमोरी-अनुकूलित टेबल बना सकते हैं और इसे एरेससोर्स पूल से जोड़ सकते हैं।
संसाधन पूल से आबद्ध होने के चरण
-
मेमोरी आवंटन के साथ संसाधन पूल बनाएं:
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 (डेटाबेस को पुनरारंभ करें) के बजाय, द्वितीयक उदाहरण के लिए डेटाबेस विफलता निष्पादित करें।
निष्कर्ष
इस मामले में, स्मृति दबाव से संबंधित सभी अलर्ट संसाधन पूल में स्मृति-अनुकूलित तालिकाओं के साथ डेटाबेस जोड़ने के बाद बंद हो गए। मैंने इस विशेष समस्या के लिए कुछ हफ़्ते के लिए SQLServer त्रुटि लॉग की निगरानी की, और किसी भी स्मृति दबाव का कोई निशान नहीं था। इन चरणों ने न्यूनतम डाउनटाइम के साथ डेटाबेस इंजन स्तर पर स्मृति दबाव को ठीक करने में मदद की।
कोई भी टिप्पणी करने या प्रश्न पूछने के लिए फीडबैक टैब का उपयोग करें। आप हमारे साथ बातचीत भी शुरू कर सकते हैं।