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
ดังที่คุณเห็นจากภาพก่อนหน้า ฐานข้อมูลที่เป็นปัญหา InMemoryDB ,ใช้เพียง 0.017% ของบัฟเฟอร์พูล
ขั้นตอนที่สอง
จากนั้นคุณตรวจสอบ OS Memory Clerks โดยใช้คำสั่ง T-SQL ต่อไปนี้:
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 เปิดใช้งานการเชื่อมโยงฐานข้อมูลโดยไม่มีตารางที่ปรับหน่วยความจำให้เหมาะสมกับแหล่งทรัพยากร แต่ไม่มีผล
- คุณสามารถสร้างตารางที่ปรับให้เหมาะสมกับหน่วยความจำในฐานข้อมูลได้หลังจากเชื่อมโยงเข้ากับพูลของแหล่งข้อมูลแล้ว
ขั้นตอนในการผูกกับพูลทรัพยากร
-
สร้าง 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% ของหน่วยความจำเซิร์ฟเวอร์ทั้งหมดจัดสรรให้กับพูลทรัพยากร อย่าลืมใช้ลิงก์ในข้อมูลอ้างอิงเพื่อคำนวณเปอร์เซ็นต์ของหน่วยความจำในสภาพแวดล้อมของคุณ
-
ตรวจสอบพูลทรัพยากรและผูกฐานข้อมูลกับมัน:
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 เป็นเวลาสองสามสัปดาห์สำหรับปัญหานี้ และไม่มีร่องรอยของแรงกดดันด้านหน่วยความจำ ขั้นตอนเหล่านี้ช่วยแก้ไขแรงกดดันของหน่วยความจำในระดับกลไกจัดการฐานข้อมูลโดยมีเวลาหยุดทำงานน้อยที่สุด
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม คุณสามารถเริ่มการสนทนากับเราได้เช่นกัน