SQL Server 2008 R2“ Ghost Memory” หรือไม่


12

เรามีเครื่อง SQL Server 2008 R2 โดยเฉพาะที่กำลังประสบปัญหาหน่วยความจำแปลก ๆ ตัวเครื่องมีทรัพยากรมากมายรวมถึงโปรเซสเซอร์ Quad-Core สองตัว, RAM ขนาด 16GB และ Windows Server 2008 R2 Enterprise ขนาด 64 บิต (เป็น Dell PowerEdge 2950) .

ปัญหาที่แปลกคือระบบรายงานหน่วยความจำ 82% ที่ใช้งานอยู่ แต่ sqlservr.exe รายงานว่ามีการใช้งาน 155mb เท่านั้น สาเหตุที่ฉันสงสัยว่า SQL Server นั้นเป็นปัญหาเพราะถ้าฉันรีสตาร์ทกระบวนการ sqlservr.exe ปริมาณการใช้หน่วยความจำกลับสู่ปกติเป็นระยะเวลาหนึ่ง

ไม่มีใครมีแนวคิดใด ๆ เกี่ยวกับวิธีที่ฉันจะเริ่มติดตามปัญหานี้ได้หรือไม่

ขอบคุณเจสัน


3
คุณกำลังใช้ผู้ใช้ล็อคหน้าในหน่วยความจำใช่ไหม? ถ้าเป็นเช่นนั้นหน่วยความจำที่ล็อคจะไม่ถูกรายงานโดยตัวจัดการงาน ดูblogs.technet.com/b/askperf/archive/2008/03/25/…สำหรับข้อมูลเพิ่มเติม
Mark S. Rasmussen

เราได้ตั้งค่าหน้าล็อคในหน่วยความจำให้ตั้งค่าเป็น "ไม่มี" นอกจากนี้เรายังมีการตั้งค่า "หน่วยความจำเซิร์ฟเวอร์สูงสุด (เป็น MB)" ด้วยค่าเริ่มต้น int.MaxValue - คุณคิดว่าอาจทำให้เกิดปัญหาหรือไม่
typefragger

4
ครั้งเดียวที่ฉันกังวลคือเมื่อเซิร์ฟเวอร์ sql ของฉันใช้น้อยกว่า 82%!
SqlACID

คำตอบ:


15

คุณจะไม่ได้รับภาพที่แท้จริงของการใช้หน่วยความจำจากตัวจัดการงานหากบัญชีที่บริการที่กำลังทำงานอยู่นั้นมีหน้าล็อคในสิทธิ์ของหน่วยความจำ (แก้ไข: ตามความเห็น / ลิงก์ของ Mark Rasmussen) หากต้องการทราบว่ามีการใช้งานหน่วยความจำเท่าใดคุณสามารถดู:

  • SQLServer: ตัวนับ perfmon ตัวนับเซิร์ฟเวอร์ Memory Manager \ Total
  • DMVs

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

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

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


ว้าวขอบคุณมาก! นี่ (โดยเฉพาะอย่างยิ่งที่สอง) ทำให้มันชัดเจนอย่างสมบูรณ์สำหรับฉัน!
typefragger

8

มีบทความล่าสุดจาก Brent Ozar ของเราที่ปฏิบัติต่อกรณีนี้เมื่อตัวจัดการงานไม่แสดงหน่วยความจำที่ถูกกินโดย SQLServer และบริการเพิ่มเติมอย่างถูกต้อง คุณสามารถค้นหาได้ที่นี่: คู่มือการดูแลระบบของไมโครซอฟท์เซิร์ฟเวอร์ SQL หน่วยความจำ

อ้างอิง: " ทำไม SQLServer.exe ถึงไม่ใช้หน่วยความจำมาก

เมื่อคุณเดสก์ท็อประยะไกลเข้าสู่เซิร์ฟเวอร์และดูที่ Task Manager การใช้งาน Mem ของ sqlservr.exe ดูเหมือนจะแปลกประหลาด นั่นไม่ใช่ความผิดของ SQL Server ตัวจัดการงานเป็นคนโกหกที่สกปรกและสกปรก (ฉันรู้ว่ามันฟังดูเหมือนว่าคนที่แต่งตัวประหลาด SQL กำลังเปลี่ยนความผิด แต่ทนกับฉันสักครู่) บนกล่อง 64 บิตหมายเลขนี้ค่อนข้างแม่นยำมากขึ้น แต่ในกล่องแบบ 32 บิตเป็นเพียงฐานออกอย่างสมบูรณ์ . ในการรับภาพที่แม่นยำของจำนวนหน่วยความจำ SQL Server ที่ใช้งานจริงคุณต้องมีเครื่องมือเช่น Process Explorer และคุณต้องระบุกระบวนการทั้งหมดของ SQL Server ในเซิร์ฟเวอร์ที่ฉันแสดงอยู่ทางขวามีอินสแตนซ์ของ SQL Server สองอินสแตนซ์ (แสดงโดย sqlservr.exe), รวมถึงเอเจนต์ SQL, เบราว์เซอร์ SQL และเครื่องมือสำรองข้อมูลของ SQL Server ไม่ใช่เรื่องแปลกที่จะเห็น SQL Server Analysis Services, Integration Services และ Reporting Services ยังทำงานบนเซิร์ฟเวอร์เดียวกันซึ่งทั้งหมดใช้หน่วยความจำ

ดังนั้น SQL ใช้หน่วยความจำเท่าไร? ฉันจะทำให้เรื่องนี้ง่ายสำหรับคุณ SQL Server ใช้หน่วยความจำทั้งหมด ระยะเวลา."

ดังนั้นฉันขอแนะนำให้คุณลองใช้การสืบค้นของ Mark และใช้เครื่องมือที่ดีกว่าสำหรับการรายงานหน่วยความจำ หรือเพียงวางใจ Perfmon เพื่อรายงานหน่วยความจำไม่ใช่ตัวจัดการงาน


-2

จำนวนหน่วยความจำที่ใช้โดย SQL ดังที่แสดงในตัวจัดการงานส่วนใหญ่จะเป็นการตั้งค่าหน่วยความจำสูงสุด นี่คือการตั้งค่าขั้นต่ำ / สูงสุด:

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

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


1
ต่ำสุด / สูงสุดควบคุมการจัดสรรพูลบัฟเฟอร์ไม่มีอะไรเพิ่มเติม นี่เป็นบรรทัดแรกในคำอธิบายของตัวเลือกหน่วยความจำเซิร์ฟเวอร์ใน BOL การตั้งค่าไม่มีความสัมพันธ์ใด ๆ กับที่ปรากฏในตัวจัดการงาน คำอธิบายของ taskmgr ของเบรนต์ว่า "คนโกหกสกปรกสกปรก" สรุปสถานการณ์รวมถึงสิ่งที่ฉันได้อ่านไปแล้ว
Mark Storey-Smith

@ MarkStorey-Smith โปรดอ่านเนื้อหาเพิ่มเติมในลิงค์ในความคิดเห็นของคุณเองมันจะอธิบายประเด็นของฉันต่อไป ตัวจัดการงานแสดงการใช้ทรัพยากรระบบ พูลบัฟเฟอร์ไม่ใช่ทรัพยากรระบบ ฉันกำลังอธิบายเกี่ยวกับการใช้งานหน่วยความจำของ SQL ที่แสดงในตัวจัดการงานหมายถึงอะไร คุณกำลังระบุชัดเจนโดยการพูดถึงบัฟเฟอร์พูล แต่ก็ยังไม่ได้พิสูจน์ว่าฉันผิด
StanleyJohns

ไม่แน่ใจว่าจะวางสิ่งนี้ดีกว่า ... "จำนวนหน่วยความจำที่ใช้โดย SQL ดังที่แสดงในตัวจัดการงานส่วนใหญ่จะเป็นการตั้งค่าหน่วยความจำสูงสุดนี่คือวิธีการตั้งค่าขั้นต่ำ / สูงสุดทำงาน" .. 'T
Mark Storey-Smith

'นี่คือการทำงานของการตั้งค่าขั้นต่ำ / สูงสุด:' มีเครื่องหมายจุดคู่ท้ายที่หมายถึงคำอธิบายดังต่อไปนี้ไม่ใช่ว่ามันจะอ้างประโยคก่อนหน้า :)
StanleyJohns

1
ฉันอยู่กับมาร์ค อ่าน บล็อก Slava Oks : เขาเป็นส่วนหนึ่งของทีม MS ที่เขียนผู้จัดการหน่วยความจำ ไปที่ส่วนหัว "บัฟเฟอร์พูล" ฉันอ้างอิง "จดจำ SQL Server มีการตั้งค่าหน่วยความจำสองแบบที่คุณสามารถควบคุมได้โดยใช้ sp_conifigure พวกเขาเป็นหน่วยความจำสูงสุดและต่ำสุดของเซิร์ฟเวอร์ฉันไม่แน่ใจว่าคุณรู้หรือไม่ จำนวนหน่วยความจำกายภาพที่ SQL Server ใช้ "
gbn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.