কম্পিউটার

SQL সার্ভারে মেমরি-অপ্টিমাইজ করা টেবিল থেকে মেমরি চাপ সতর্কতা পরিচালনা করুন

মাইক্রোসফ্ট এসকিউএল সার্ভার মেমরি পরিচালনার দিক থেকে খুব স্মার্ট, তবে কখনও কখনও মেমরির চাপ সতর্কতা এবং ডাটাবেস ইঞ্জিনগুলি আরও মেমরির দাবি করে, যার ফলে ত্রুটি দেখা দেয়৷

পরিচয়

মেমরি-অপ্টিমাইজ করা টেবিল (ইন-মেমরি অনলাইন লেনদেন প্রক্রিয়াকরণ (OLTP)) দ্বারা সৃষ্ট SQL Server® 2019 (Enterprise Edition) এ মেমরির চাপের কারণে আপনি যে ব্যতিক্রমী পরিস্থিতির সম্মুখীন হতে পারেন তার একটি সমাধান করার বিষয়ে এই পোস্টটি আলোচনা করে। একই পদক্ষেপগুলি 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 বাফার পুলে মেমরি খরচ পরীক্ষা করা।

SQL সার্ভারে মেমরি-অপ্টিমাইজ করা টেবিল থেকে মেমরি চাপ সতর্কতা পরিচালনা করুন

আপনি আগের চিত্র থেকে দেখতে পাচ্ছেন, প্রশ্নে থাকা ডাটাবেস, InMemoryDB ,বাফার পুলের মাত্র 0.017% ব্যবহার করে।

ধাপ দুই

তারপর আপনি নিম্নলিখিত T-SQL কমান্ড ব্যবহার করে OS মেমরি ক্লার্কগুলি পরীক্ষা করুন:

select * from sys.dm_os_memory_clerks order by pages_kb desc
SQL সার্ভারে মেমরি-অপ্টিমাইজ করা টেবিল থেকে মেমরি চাপ সতর্কতা পরিচালনা করুন

ফলাফলগুলি দেখায় যে শীর্ষ ভোক্তাদের মোট মোট সর্বোচ্চ সার্ভার মেমরির প্রায় 80% ছিল৷

মেমরি-অপ্টিমাইজ করা টেবিলের আকারও 2 GB এর কম, যা আপনি DB_ID_6 নামের পূর্ববর্তী ছবিতে দেখতে পাচ্ছেন . যেমন, আদর্শভাবে, সার্ভারে কোনো মেমরির চাপ থাকা উচিত নয়।

ধাপ তিন

ত্রুটি লগে উল্লিখিত মেমরির বাইরে (OOM) লিঙ্কগুলি পর্যালোচনা করার পরে,https://go.microsoft.com/fwlink/?LinkId=510837 , আপনাকে একটি রিসোর্স পুলে মেমরি-অপ্টিমাইজ করা টেবিলের সাথে ডেটাবেস আবদ্ধ করতে হবে। এই বাঁধাই মেমরি-অপ্টিমাইজ করা টেবিলের সাথে ডাটাবেসের জন্য একটি সর্বোত্তম অনুশীলন। রিসোর্স গভর্নরে একটি রিসোর্সপুল তৈরি করতে এবং ডাটাবেস আবদ্ধ করতে পদক্ষেপগুলি অনুসরণ করুন৷

সর্বোত্তম অনুশীলনগুলি সুপারিশ করে যে আপনি SQL সার্ভারকে এর সম্পদগুলি এক বা একাধিক মেমরি-অপ্টিমাইজ করা টেবিলের দ্বারা ব্যবহার করা থেকে রক্ষা করুন এবং অন্যান্য মেমরি ব্যবহারকারীদের মেমরি-অপ্টিমাইজ করা টেবিলের জন্য প্রয়োজনীয় মেমরি ব্যবহার করা থেকে আটকান৷ অতএব, মেমরি-অপ্টিমাইজ করা টেবিলের সাথে ডেটাবেসের জন্য মেমরি খরচ পরিচালনা করার জন্য আপনাকে একটি পৃথক রিসোর্স পুল তৈরি করা উচিত।

রিসোর্স পুলে একটি ডাটাবেস যোগ করার সময় নিম্নলিখিত বিষয়গুলি মাথায় রাখুন:

  • আপনি শুধুমাত্র একটি রিসোর্স পুলে একটি ডাটাবেস আবদ্ধ করতে পারেন।
  • আপনি একই পুলে একাধিক ডাটাবেস আবদ্ধ করতে পারেন।
  • এসকিউএল সার্ভার মেমরি-অপ্টিমাইজ করা টেবিল ছাড়াই একটি ডাটাবেসকে আরসোর্স পুলে বাঁধাই করতে সক্ষম করে, কিন্তু এর কোনো প্রভাব নেই।
  • আরসোর্স পুলে বাঁধার পর আপনি ডাটাবেসে মেমরি-অপ্টিমাইজ করা টেবিল তৈরি করতে পারেন।

রিসোর্স পুলের সাথে আবদ্ধ হওয়ার পদক্ষেপগুলি

  1. মেমরি বরাদ্দ দিয়ে রিসোর্স পুল তৈরি করুন:

    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% রিসোর্স পুলে বরাদ্দ করা হয়। আপনার পরিবেশে মেমরির শতাংশ গণনা করতে রেফারেন্সগুলিতে লিঙ্কগুলি ব্যবহার করতে ভুলবেন না৷

  2. রিসোর্স পুল যাচাই করুন এবং এতে ডাটাবেস আবদ্ধ করুন:

    EXEC sp_xtp_bind_db_resource_pool 'InMemoryDB', 'Admin_Pool'  
    GO
    
  3. sys.databases-এ বাইন্ড যাচাই করুন :

    SELECT d.database_id, d.name, d.resource_pool_id  
    FROM sys.databases d
    GO
    
    SQL সার্ভারে মেমরি-অপ্টিমাইজ করা টেবিল থেকে মেমরি চাপ সতর্কতা পরিচালনা করুন
  4. বাইন্ডিং সক্রিয় করতে ডাটাবেস পুনরায় আরম্ভ করুন:

    ALTER DATABASE DB_Name SET OFFLINE  
    GO  
    ALTER DATABASE DB_Name SET ONLINE  
    GO  
    

দ্রষ্টব্য :যদি ডাটাবেস সবসময় চালু থাকে, তাহলে উভয় নোডের ধাপগুলি সম্পাদন করুন, এবং ধাপ 4 (ডাটাবেস পুনরায় চালু করুন) এর পরিবর্তে, এই গৌণ উদাহরণে একটি ডাটাবেস ব্যর্থতা সঞ্চালন করুন৷

উপসংহার

এই ক্ষেত্রে, রিসোর্স পুলে মেমরি-অপ্টিমাইজ করা টেবিলের সাথে ডেটাবেস যুক্ত করার পরে মেমরির চাপ সম্পর্কিত সমস্ত সতর্কতা বন্ধ হয়ে যায়। আমি এই নির্দিষ্ট সমস্যার জন্য কয়েক সপ্তাহের জন্য SQLServer ত্রুটি লগগুলি নিরীক্ষণ করেছি এবং কোনও মেমরি চাপের কোনও চিহ্ন ছিল না। এই পদক্ষেপগুলি ন্যূনতম ডাউনটাইম সহ ডাটাবেস ইঞ্জিন স্তরে মেমরির চাপ ঠিক করতে সাহায্য করেছে৷

কোনো মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে প্রতিক্রিয়া ট্যাব ব্যবহার করুন। আপনি আমাদের সাথে একটি কথোপকথনও শুরু করতে পারেন৷


  1. একটি AWS RDS উদাহরণে একটি SQL সার্ভার ডাটাবেস স্থানান্তর করুন

  2. Microsoft SQL সার্ভার ক্যোয়ারী স্টোর

  3. ইউনিফাইড ডেটা প্ল্যাটফর্ম:SQL সার্ভার 2019

  4. এমএস অ্যাক্সেস থেকে SQL সার্ভার ডেটাবেসে ডেটা স্থানান্তর করুন