หน่วยความจำ SQL Server

Oct 25 2020

มันเกี่ยวกับหน่วยความจำ SQL Server เมื่อเซิร์ฟเวอร์หน่วยความจำหมดเราขอแนะนำให้เพิ่มหน่วยความจำเพิ่มเติมให้กับฮาร์ดแวร์เพื่อเอาชนะปัญหาการใช้งาน CPU

แต่ก่อนที่จะดำเนินการอัปเกรดหน่วยความจำในฐานะส่วนหนึ่งของการแก้ไขปัญหาเราจะตรวจสอบ / คำนวณหน่วยความจำ SQL ที่ใช้งานบนอินสแตนซ์ได้อย่างไร

ตัวอย่างเช่น:

ชื่อเซิร์ฟเวอร์: XXXXXXXXXXXXX

หน่วยความจำกายภาพ (RAM) ที่ติดตั้ง: 64.0 GB

จัดสรรหน่วยความจำ SQL Server ในปัจจุบัน: 58982 MB -> 58.982 GB

ในกรณีนี้เรามีอินสแตนซ์เดียว (MSSQLSERVER) บนเซิร์ฟเวอร์และมีการจัดสรรหน่วยความจำ 80% ให้กับอินสแตนซ์ตามมาตรฐาน และ 20% ถูกจัดสรรให้กับ Application & OS

เมื่อเราตรวจสอบใน Resource Monitor จะแสดงเป็น 80% ตามที่เราได้ตั้งค่าหน่วยความจำเซิร์ฟเวอร์ SQL ไว้ที่

แต่ไม่ได้หมายความว่า 80% ของ SQL ถูกใช้อย่างสมบูรณ์เนื่องจาก SQL จะเก็บพื้นที่บางส่วนในบัฟเฟอร์ที่แบ็กเอนด์ เมื่อฉันท่องฉันได้รับสูตรด้านล่างเพื่อคำนวณหน่วยความจำ SQL ที่ใช้ในอินสแตนซ์ แต่พารามิเตอร์เหล่านี้ถูกลบออกในเครื่องมือตรวจสอบประสิทธิภาพย้อนหลังไปนานแล้ว

มีวิธีตรวจสอบหรือไม่ว่าขณะนี้ SQL ใช้ประโยชน์จาก 80% (OR) ไปเท่าใดกับเมตริกใดที่เราสามารถดำเนินการอัปเกรดหน่วยความจำได้

สูตรสำหรับการคำนวณหน่วยความจำ SQL: (พารามิเตอร์ด้านล่างถูกลบออกจากการตรวจสอบประสิทธิภาพ)

*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB

คำตอบ

3 Shanky Oct 26 2020 at 09:51

เราจะตรวจสอบ / คำนวณหน่วยความจำ SQL ที่ใช้งานบนอินสแตนซ์ได้อย่างไร

ที่ค่อนข้างง่ายที่จะทำ คุณมี DMV sys.dm_os_process_memoryที่จะให้ข้อมูลแก่คุณ มันจะให้คุณphysical memory usedและtotal memory used (RAM+Page file)

    select (physical_memory_in_use_kb/1024) as Phy_Mem_used_MB, (virtual_address_space_committed_kb/1024) as Total_mem_Used_MB
   from sys.dm_os_process_memory

แต่ไม่ได้หมายความว่า 80% ของ SQL ถูกใช้อย่างสมบูรณ์เนื่องจาก SQL จะเก็บพื้นที่บางส่วนในบัฟเฟอร์ที่แบ็กเอนด์

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

มีวิธีตรวจสอบหรือไม่ว่าขณะนี้ SQL ใช้ประโยชน์จาก 80% (OR) ไปเท่าใดกับเมตริกใดที่เราสามารถดำเนินการอัปเกรดหน่วยความจำได้

อย่างที่ฉันพูดเมื่อใช้แล้วจะแสดงหน่วยความจำทั้งหมดที่ใช้แม้ว่าจะไม่ต้องการหน้านั้นในการประมวลผลแบบสอบถามก็ตาม เมื่อมีคำขอใหม่มาหน้าเหล่านี้จะถูกย้ายออกเพื่อสร้างพื้นที่สำหรับเพจใหม่

2 TiborKaraszi Oct 26 2020 at 12:18

คุณกำหนด "ใช้" อย่างไร? หน้าที่ถูกอ่านในแคชเมื่อวินาทีที่แล้วจะนับว่าถูกใช้หรือไม่ นาทีที่แล้ว? หนึ่งชั่วโมง? สัปดาห์?

ประเด็นคือไม่มีสิ่งที่เรียกว่า "ใช้ประโยชน์" เซิร์ฟเวอร์ SQL เก็บเพจ (และสิ่งอื่น ๆ ) ไว้ในหน่วยความจำ เมื่อมีความกดดันของหน่วยความจำ (ภายในหรือภายนอก) กลไกการกำหนดอายุแคชแบบดั้งเดิม (โดยทั่วไป) จะถูกใช้เพื่อลบสิ่งที่ใช้น้อยที่สุด มีรายละเอียดเพิ่มเติมเกี่ยวกับการจัดการหน่วยความจำ (แคช) มากขึ้น แต่โดยพื้นฐานแล้วจะได้รับการจัดการเช่นเดียวกับกลไกการแคช

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

คุณสามารถลดหน่วยความจำเซิร์ฟเวอร์สูงสุดและดูว่าประสิทธิภาพของคุณเริ่มแย่ลงเมื่อใด

2 AlekseyVitsko Oct 26 2020 at 16:09

ใช้MemoryManagerInfoขั้นตอนการจัดเก็บซึ่งสามารถพบได้ที่นี่:

https://github.com/aleksey-vitsko/Database-Administrator-Tools

มันมีรายละเอียดที่ดีของวิธี SQL Server ปัจจุบันใช้หน่วยความจำ:
ดูตัวอย่างภาพด้านล่างนี้ - นี่คือสิ่งที่เซิร์ฟเวอร์ของฉันอยู่ในขณะนี้การบริโภค:

คร่าวๆTotal Server Memory= Database Cache Memory+ Free Memory+ Stolen Server Memory(หน่วยความจำเซิร์ฟเวอร์ที่ถูกขโมยรวมถึง Plan Cache, Locks ฯลฯ )