ভূমিকা
মাইক্রোসফ্ট SQL Server মেমরি পরিচালনার ক্ষেত্রে খুব স্মার্ট, কিন্তু কখনও কখনও মেমরি প্রেশার অ্যালার্ট এবং ডাটাবেস ইঞ্জিন আরও মেমরির দাবি করে, যা ত্রুটির দিকে নিয়ে যায়।
এই পোস্টে SQL Server® 2019 (এন্টারপ্রাইজ এডিশন)-এ মেমরি-অপ্টিমাইজড টেবিল (ইন-মেমরি OLTP) জনিত মেমরি প্রেশারের একটি ব্যতিক্রমী পরিস্থিতি সমাধানের পদ্ধতি আলোচনা করা হয়েছে। একই ধাপগুলি SQL Server 2014 এবং পরবর্তী সংস্করণের জন্যও প্রযোজ্য।
আপনি নিম্নলিখিত ত্রুটি বার্তাগুলি দেখতে পারেন:
বার্তা: উইন্ডোজে MSSQL: চুরি করা সার্ভার মেমরি খুব বেশি
সোর্ট: XXXXX\MSSQLSERVER
পথ: উপস্থিত নয়
অ্যালার্ট বিবরণ: কম্পিউটার "XXXXXXX.XXX.com"-এ SQL ইনস্ট্যান্স "MSSQLSERVER"-এর চুরি করা সার্ভার মেমরি খুব বেশি।
বার্তা: SQL Server অ্যালার্ট সিস্টেম: \\XXXXXXX-এ 'সেভারিটি ১৭' ঘটেছে
বিবরণ: রিসোর্স পুল 'internal'-এ এই কোয়েরি চালানোর জন্য পর্যাপ্ত সিস্টেম মেমরি নেই।
বার্তা: ডাটাবেস 'InMemoryDB'-এ পেজ alokেশন অনুমোদন করা হয়নি কারণ রিসোর্স পুল 'default'-এ অপর্যাপ্ত মেমরি। আরও তথ্যের জন্য 'https://go.microsoft.com/fwlink/?LinkId=510837' দেখুন।
বার্তা: মেমরি প্রেশারের কারণে XTP পেজ alokেশন ব্যর্থ: FAIL_PAGE_ALLOCATION 32
সমাধান
এই সমস্যা সমস্যা निवারণ এবং সমাধানের জন্য নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
ধাপ ১: SQL বাফার পুলে মেমরি খপত পরীক্ষা করুন
প্রথম ধাপ হল SQL বাফার পুলে মেমরি খপত যাচাই করা।
উপরোক্ত ছবি থেকে দেখা যাচ্ছে যে, প্রশ্নগত ডাটাবেস InMemoryDB বাফার পুলের মাত্র ০.০১৭% ব্যবহার করছে।
ধাপ ২: OS মেমরি ক্লার্কস যাচাই করুন
তারপর নিম্নলিখিত T-SQL কমান্ড ব্যবহার করে OS মেমরি ক্লার্কস যাচাই করুন:
select * from sys.dm_os_memory_clerks order by pages_kb desc
ফলাফলে দেখা গেল শীর্ষভুক্ত ব্যবহারকারীর মোট প্রায় সর্বোচ্চ সার্ভার মেমরির ৮০%। মেমরি-অপ্টিমাইজড টেবিলের আকারও ২ GB-এর কম, যা পূর্বের ছবিতে DB_ID_6 নামে দেখা যাচ্ছে। তাই আদर्शভাবে সার্ভারে কোনো মেমরি প্রেশার হওয়া উচিত নয়।
ধাপ ৩: ডাটাবেসকে রিসোর্স পুলের সাথে বাইন্ড করুন
ত্রুটি লগে উল্লিখিত আউট-অফ-মেমরি (OOM) লিঙ্ক https://go.microsoft.com/fwlink/?LinkId=510837 পর্যালোচনা করার পর, মেমরি-অপ্টিমাইজড টেবিলযুক্ত ডাটাবেসকে একটি রিসোর্স পুলের সাথে বাইন্ড করতে হবে। এটি মেমরি-অপ্টিমাইজড টেবিলযুক্ত ডাটাবেসের জন্য সেরা অনুশীলন। রিসোর্স গভর্নরে একটি রিসোর্স পুল তৈরি করে ডাটাবেস বাইন্ড করার ধাপগুলি নিচে দেওয়া হল:
মেমরি-অপ্টিমাইজড টেবিলযুক্ত ডাটাবেসকে রিসোর্স পুলে যোগ করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
- একটি ডাটাবেস কেবল একটি রিসোর্স পুলের সাথে বাইন্ড করা যাবে।
- একাধিক ডাটাবেস একই পুলে বাইন্ড করা যাবে।
- মেমরি-অপ্টিমাইজড টেবিলবিহীন ডাটাবেসও রিসোর্স পুলে বাইন্ড করা যাবে, কিন্তু তার কোনো প্রভাব নেই।
- রিসোর্স পুলে বাইন্ড করার পর ডাটাবেসে মেমরি-অপ্টিমাইজড টেবিল তৈরি করা যাবে।
রিসোর্স পুলে বাইন্ড করার ধাপাবলী
-
মেমরি alokেশন সহ রিসোর্স পুল তৈরি করুন:
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 এর মান একই রাখা উচিত।
এই ক্ষেত্রে, মেমরি-অপ্টিমাইজড টেবিলগুলো খুব ছোট, তাই মোট সার্ভার মেমরির ১৫% রিসোর্স পুলের জন্য alokেট করা হয়েছে। আপনার পরিবেশে মেমরির শতাংশ হিসাব করার জন্য রেফারেন্স লিঙ্কগুলো ব্যবহার করুন না ভুলে।
-
রিসোর্স পুল যাচাই করুন এবং ডাটাবেসকে সেটি সাথে বাইন্ড করুন:
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
দ্রষ্টব্য: যদি ডাটাবেস Always On থাকে, তবে উভয় নোডেই ধাপগুলো অনুসরণ করুন এবং ধাপ ৪ (ডাটাবেস রিস্টার্ট) এর পরিবর্তে সেকেন্ডারি ইনস্ট্যান্সে ডাটাবেস ফেইলওভার করুন।
উপসংহার
এই কেসে, মেমরি-অপ্টিমাইজড টেবিলযুক্ত ডাটাবেসগুলো রিসোর্স পুলে যোগ করার পর মেমরি প্রেশার সংক্রান্ত সকল অ্যালার্ট বন্ধ হয়ে গেল। আমি কয়েক সপ্তাহ SQL Server এরর লগ মনিটর করেছি এবং মেমরি প্রেশার কোনো ট্রেস পাইনি। এই ধাপগুলো ন্যূনতম ডাউনটাইমের সাথে ডাটাবেস ইঞ্জিন লেভেলে মেমরি প্রেশার সমাধান করতে সাহায্য করল।
ফিডব্যাক ট্যাব ব্যবহার করে মন্তব্য করুন বা প্রশ্ন জিজ্ঞাসা করুন। আপনি আমাদের সাথে কথা বলতে পারেন।