ปริมาณการใช้หน่วยความจำของ SQL Server 2012 ภายนอกพูลบัฟเฟอร์


10

ฉันมีอินสแตนซ์ของ SQL Server 2012 SP2 Enterprise Edition ที่ใช้หน่วยความจำประมาณ 20GB สูงกว่าค่าสูงสุด ขีด จำกัด หน่วยความจำ อินสแตนซ์ถูก จำกัด ที่ 65GB แต่หน่วยความจำกายภาพที่ใช้งานจากแบบสอบถามด้านล่างแสดง 86GB

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

เซิร์ฟเวอร์มีอยู่จริงโดยมี 2 NUMA โหนด มีวิธีที่ฉันสามารถค้นหาสิ่งที่ใช้หน่วยความจำภายนอกของบัฟเฟอร์พูล (ฉันสมมติว่าเกิดอะไรขึ้น)

นี่คือผลลัพธ์ของ DBCC MEMORYSTATUS: -

เอาต์พุตของ DBCC MEMORYSTATUS

และนี่คือขีด จำกัด หน่วยความจำที่ตั้งไว้: -

สกรีนช็อตของหน่วยความจำ จำกัด

ขอบคุณล่วงหน้า.

ปรับปรุง: - ฉันเรียกใช้แบบสอบถามที่แอรอนแนะนำ

SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC

นี่คือผลลัพธ์: -

MemoryClerkOutput

SUM ของ pages_kb มาถึง ~ 60GB

อัพเดต 2: - เอาต์พุตเต็มของหน่วยความจำ DBCC อยู่ที่นี่: - http://pastebin.com/nGn6kXEc

ปรับปรุง 3: - ผลลัพธ์ของสคริปต์ของ Shanky ในไฟล์ excel ที่นี่: - http://jmp.sh/LKRlH4K

ปรับปรุง 4: - ภาพหน้าจอของผลลัพธ์ของ: -

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

ภาพหน้าจอของ PhysMemInUse

ดังนั้นนี่จึงดูเหมือนว่าบ่งชี้ว่า SQL Server ใช้มากกว่า 65GB ที่ตั้งไว้


ผลผลิตนี้คืออะไร SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand

สวัสดีแอรอนขอบคุณสำหรับการตอบกลับ ฉันจะอัปเดตคำถามด้วยผลลัพธ์ตอนนี้
dbafromthecold

คำตอบ:


11

แม็กซ์ควบคุมหน่วยความจำเซิร์ฟเวอร์ buffer สระว่ายน้ำและจัดสรรขนาดหน้า แต่ยังคงไม่สามารถควบคุมสิ่งต่างๆเช่นการจัดสรรของ Windows โดยตรง (เซิร์ฟเวอร์ที่เชื่อมโยง sp_OA, XPs) หน่วยความจำที่จำเป็นสำหรับหัวข้อ / กองด้าย ฯลฯ

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

แนวคิดที่เป็นไปได้บางประการสำหรับการติดตามสิ่งนี้ (ฉันจะทำให้ทุกอย่างเป็น MB):

  • เคาน์เตอร์วัดประสิทธิภาพ

    ดูว่ามีอะไรกระโดดออกมาที่นี่มีขนาดใหญ่เกินไปหรือไม่:

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
  • เสมียน 20 อันดับแรก

    คุณได้ทำสิ่งนี้ไปแล้ว แต่เพื่อความสมบูรณ์:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
  • ขนาดสแต็คด้าย

    ก่อนอื่นตรวจสอบให้แน่ใจว่านี่เป็นศูนย์และไม่ใช่หมายเลขที่กำหนดเอง (ถ้าไม่ใช่ 0, หาสาเหตุและแก้ไขได้):

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';

    แต่คุณยังสามารถดูจำนวนหน่วยความจำที่ถูกใช้โดยชุดสแต็กโดยใช้:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • โหลดโมดูลของบุคคลที่สามแล้ว

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
  • DMV ที่เกี่ยวข้องกับหน่วยความจำ

    นอกจากนี้คุณยังอาจมองเห็นสิ่งที่ไม่ธรรมดาจาก DMV เหล่านี้:

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;

บทความนี้เขียนขึ้นก่อน SQL Server 2012 ดังนั้นอาจต้องปรับชื่อคอลัมน์และการคำนวณบางอย่าง แต่อาจให้ช่องทางอื่น ๆ ด้วยเช่นกัน:

พื้นหลังที่ดีบางอย่างในบทความอื่นในเว็บไซต์นั้นเช่นกัน:

ข้อมูลที่ดีเกี่ยวกับประเภทของสิ่งต่าง ๆ ที่ใช้หน่วยความจำภายนอกmax server memory(แต่ไม่มีข้อมูลที่ดีเกี่ยวกับวิธีรวบรวมการใช้งานจริง):


ขอบคุณ Aaron ที่เซิร์ฟเวอร์มีหน่วยความจำมากมายฉันแค่อยากจะดูว่าฉันสามารถค้นหาสิ่งที่ใช้ 20GB นั้นได้ไหม มีวิธีการระบุปริมาณการใช้หน่วยความจำของ Direct Windows Allocations หรือ Thread Stacks หรือไม่
dbafromthecold

ฉันใช้งานสคริปต์และตัวนับเซิร์ฟเวอร์ที่ถูกขโมย (KB) อยู่ที่ 14GB จะขุดเพื่อดูว่าฉันจะได้รับข้อมูลเพิ่มเติมใด ๆ
dbafromthecold

หน่วยความจำเซิร์ฟเวอร์ที่ถูกขโมยดูเหมือนจะไม่เป็นปัญหา ยังคงมองหา
dbafromthecold

ในขณะที่ไม่ใช่ปัญหาที่นี่ก็ควรกล่าวถึงว่า Columnstore Object Pool (CACHESTORE_COLUMNSTOREOBJECTPOOL ประเภทเสมียนหน่วยความจำ) อยู่นอกบัฟเฟอร์พูลเช่นกัน ดูโพสต์บล็อกนี้จาก Niko Neugebauer
Blaž Dakskobler

@ BlažDakskoblerใช่ขอบคุณในหน่วยความจำด้วย ฉันจะอัปเดตโพสต์เมื่อฉันมีโอกาส
Aaron Bertrand

3

ฉันได้คำจำกัดความด้านล่างจาก Bob Dorr เกี่ยวกับหน่วยความจำเซิร์ฟเวอร์ Max ในการควบคุม SQL Server 2012 นอกจากนี้คุณยังสามารถอ่านหนังสือออนไลน์เพื่อรับรายละเอียดเพิ่มเติม

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

หน่วยความจำที่จัดสรรให้กับ thread stack, DLL ของบุคคลที่สาม, ผู้ให้บริการเซิร์ฟเวอร์ที่เชื่อมโยงซึ่งนอกเหนือจาก Microsoft (เช่น MySQL.PostgreSQL ฯลฯ ) หรือ DLL ใด ๆ ที่โหลดในพื้นที่ที่อยู่ SQL Server ซึ่งไม่ใช่ SQL Server จะถูกจัดสรรนอกหน่วยความจำเซิร์ฟเวอร์สูงสุด การดำเนินการสำรองข้อมูล IIRC ใน SQL Server 2012 ยังคงจัดสรรหน่วยความจำภายนอกพูบัฟเฟอร์

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

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

คุณสามารถอัพโหลดDBCC MMEMORYSTATUSผลลัพธ์ทั้งหมดในบางตำแหน่งที่แชร์และโพสต์ลิงค์ได้ที่นี่ สิ่งนี้จะช่วยในการทำความเข้าใจว่าองค์ประกอบใดที่ใช้ความทรงจำ

แก้ไข:ตามเอาต์พุต dbcc memorystatus ฉันสามารถเห็น 2 NUMA nodes และหน่วยความจำที่แต่ละโหนดใช้ประมาณ

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

อีกครั้งถ้าคุณเห็นตัวจัดการหน่วยความจำใน memorystatus เอาท์พุท

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

VM ที่กำหนดไว้เป็นหน่วยความจำเสมือนจริงที่กระทำโดย SQL Server และเนื่องจากหน่วยความจำนี้มีการยืนยันphysical memory backing itแล้ว อีกครั้งซึ่งทำให้ฉันคิดว่า SQL Server ใช้ 65 G ตามที่กำหนดไว้ในหน่วยความจำเซิร์ฟเวอร์สูงสุด

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

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

@DBAFromTheCold: มันสาย แต่คุณยังคงมองหาคำตอบถ้าใช่ฉันต้องการลองอีกครั้ง :) คุณสามารถโพสต์เอาท์พุทที่สมบูรณ์ของselect * from sys.dm_so_process_memory
Shanky

สวัสดี Shanky ขอบคุณสำหรับการตอบกลับ แต่ปัญหาได้รับการแก้ไขแล้ว ไม่มีอะไรในส่วนของฉัน SQL ปล่อยหน่วยความจำด้วยตัวเอง ฉันกำลังตรวจสอบเซิร์ฟเวอร์และหากเกิดขึ้นอีกครั้งฉันจะโพสต์การอัปเดต อยากไปให้ถึงจุดนี้
dbafromthecold
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.