Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

จัดการการแจ้งเตือนความดันหน่วยความจำจากตารางที่ปรับให้เหมาะสมกับหน่วยความจำใน SQL Server

Microsoft SQL Server นั้นฉลาดมากในแง่ของการจัดการหน่วยความจำ แต่บางครั้ง การแจ้งเตือนแรงดันหน่วยความจำและกลไกฐานข้อมูลต้องการหน่วยความจำมากขึ้น ซึ่งนำไปสู่ข้อผิดพลาด

แนะนำตัว

โพสต์นี้อธิบายวิธีแก้ไขสถานการณ์พิเศษที่คุณอาจประสบเนื่องจากแรงกดดันด้านหน่วยความจำใน SQL Server® 2019 (รุ่น Enterprise) ที่เกิดจากตารางที่ปรับหน่วยความจำให้เหมาะสม (การประมวลผลธุรกรรมออนไลน์ในหน่วยความจำ (OLTP)) ขั้นตอนเดียวกันกับ SQL Server 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 Server

ดังที่คุณเห็นจากภาพก่อนหน้า ฐานข้อมูลที่เป็นปัญหา InMemoryDB ,ใช้เพียง 0.017% ของบัฟเฟอร์พูล

ขั้นตอนที่สอง

จากนั้นคุณตรวจสอบ OS Memory Clerks โดยใช้คำสั่ง T-SQL ต่อไปนี้:

select * from sys.dm_os_memory_clerks order by pages_kb desc
จัดการการแจ้งเตือนความดันหน่วยความจำจากตารางที่ปรับให้เหมาะสมกับหน่วยความจำใน SQL Server

ผลการวิจัยพบว่าผู้บริโภคอันดับต้น ๆ ทั้งหมดอยู่ที่ประมาณ 80% ของหน่วยความจำเซิร์ฟเวอร์สูงสุดทั้งหมด

ขนาดของตารางที่ปรับให้เหมาะสมกับหน่วยความจำก็น้อยกว่า 2 GB ซึ่งคุณสามารถเห็นได้จากรูปภาพก่อนหน้าของชื่อ DB_ID_6 . ดังนั้น ตามหลักการแล้ว ไม่ควรมีแรงกดดันด้านหน่วยความจำบนเซิร์ฟเวอร์

ขั้นตอนที่สาม

หลังจากตรวจสอบลิงก์หน่วยความจำไม่เพียงพอ (OOM) ที่กล่าวถึงในบันทึกข้อผิดพลาดhttps://go.microsoft.com/fwlink/?LinkId=510837 คุณต้องผูกฐานข้อมูลกับตารางที่ปรับให้เหมาะสมกับหน่วยความจำกับพูลทรัพยากร การเชื่อมโยงนี้เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับฐานข้อมูลที่มีตารางที่ปรับให้เหมาะสมกับหน่วยความจำ ทำตามขั้นตอนเพื่อสร้างพูลทรัพยากรในผู้ควบคุมทรัพยากรและผูกฐานข้อมูล

แนวทางปฏิบัติที่ดีที่สุดแนะนำว่า คุณปกป้อง SQL Server จากการมีทรัพยากรที่ใช้โดยตารางที่ปรับให้เหมาะสมกับหน่วยความจำอย่างน้อยหนึ่งตาราง และป้องกันไม่ให้ผู้ใช้หน่วยความจำรายอื่นใช้หน่วยความจำที่จำเป็นโดยตารางที่ปรับให้เหมาะสมกับหน่วยความจำ ดังนั้น คุณควรสร้างพูลทรัพยากรแยกต่างหากเพื่อจัดการการใช้หน่วยความจำสำหรับฐานข้อมูลด้วยตารางที่ปรับให้เหมาะสมกับหน่วยความจำ

โปรดคำนึงถึงประเด็นต่อไปนี้เมื่อเพิ่มฐานข้อมูลไปยังพูลทรัพยากร:

  • คุณผูกฐานข้อมูลกับพูลทรัพยากรได้เพียงกลุ่มเดียว
  • คุณสามารถผูกหลายฐานข้อมูลเข้ากับพูลเดียวกันได้
  • SQL Server เปิดใช้งานการเชื่อมโยงฐานข้อมูลโดยไม่มีตารางที่ปรับหน่วยความจำให้เหมาะสมกับแหล่งทรัพยากร แต่ไม่มีผล
  • คุณสามารถสร้างตารางที่ปรับให้เหมาะสมกับหน่วยความจำในฐานข้อมูลได้หลังจากเชื่อมโยงเข้ากับพูลของแหล่งข้อมูลแล้ว

ขั้นตอนในการผูกกับพูลทรัพยากร

  1. สร้าง Resource Pool ด้วยการจัดสรรหน่วยความจำ:

    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 Server
  4. รีสตาร์ทฐานข้อมูลเพื่อให้มีผลผูกพัน:

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

หมายเหตุ :หากฐานข้อมูลเปิดอยู่เสมอ ให้ทำตามขั้นตอนบนทั้งสองโหนด และแทนที่จะทำขั้นตอนที่ 4 (รีสตาร์ทฐานข้อมูล) ให้ดำเนินการเฟลโอเวอร์ของฐานข้อมูลไปยังอินสแตนซ์รอง

บทสรุป

ในกรณีนี้ การแจ้งเตือนทั้งหมดที่เกี่ยวข้องกับความดันหน่วยความจำหยุดลงหลังจากเพิ่มฐานข้อมูลที่มีตารางที่ปรับให้เหมาะสมกับหน่วยความจำไปยังพูลทรัพยากร ฉันตรวจสอบบันทึกข้อผิดพลาดของ SQLServer เป็นเวลาสองสามสัปดาห์สำหรับปัญหานี้ และไม่มีร่องรอยของแรงกดดันด้านหน่วยความจำ ขั้นตอนเหล่านี้ช่วยแก้ไขแรงกดดันของหน่วยความจำในระดับกลไกจัดการฐานข้อมูลโดยมีเวลาหยุดทำงานน้อยที่สุด

ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณสามารถเริ่มการสนทนากับเราได้เช่นกัน