Konsumsi memori SQL Server 2012 di luar buffer pool


10

Saya punya contoh SQL Server 2012 SP2 Enterprise Edition yang mengkonsumsi ~ 20GB memori lebih tinggi dari maks. batas memori. Mesin virtual ini dibatasi hingga 65GB tetapi memori fisik yang digunakan dari kueri di bawah ini menunjukkan 86GB

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

Server bersifat fisik dengan 2 NUMA node. Apakah ada cara yang bisa saya cari tahu apa yang menghabiskan memori di luar buffer pool (saya berasumsi bahwa itulah yang terjadi)?

Inilah output dari DBCC MEMORYSTATUS: -

output dari DBCC MEMORYSTATUS

Dan inilah batas memori yang ditetapkan: -

tangkapan layar batas memori

Terima kasih sebelumnya.

UPDATE: - Saya telah menjalankan kueri yang disarankan Aaron

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

Inilah hasilnya: -

MemoryClerkOutput

SUM dari pages_kb mencapai ~ 60GB

UPDATE 2: - Output penuh DBCC MEMORYSTATUS ada di sini: - http://pastebin.com/nGn6kXEc

PEMBARUAN 3: - Keluaran skrip Shanky dalam file excel di sini: - http://jmp.sh/LKRlH4K

UPDATE 4: - Screenshot dari output: -

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

Tangkapan Layar PhysMemInUse

Jadi ini tampaknya menunjukkan bahwa SQL Server menggunakan lebih dari 65GB yang ditetapkan.


Apa hasil ini? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand

Hai Aaron, terima kasih telah membalas. Saya akan memperbarui pertanyaan dengan output sekarang
dbafromthecold

Jawaban:


11

Memori server maks mengontrol kumpulan buffer dan semua alokasi ukuran halaman, tetapi masih tidak mengontrol hal-hal seperti alokasi Windows langsung (server tertaut, sp_OA, XPs), memori yang diperlukan untuk thread / tumpukan thread, dll .

Anda mungkin dapat mengharapkan ini lebih tinggi pada NUMA (meskipun saya tidak yakin 20 GB adalah normal); intinya adalah, Anda tidak dapat mengharapkan memori server maks untuk sepenuhnya mengontrol memori yang digunakan oleh contoh SQL Server. Jika Anda ingin seluruh instance (tidak hanya buffer pool, cache rencana, dan CLR) menggunakan tidak lebih dari 64GB, Anda harus mengatur memori server maks ke sesuatu yang lebih rendah.

Beberapa ide potensial untuk melacak ini (saya akan menormalkan semuanya ke MB):

  • penghitung kinerja

    Lihat apakah ada yang melompat terlalu besar di sini:

    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 panitera terbaik

    Anda sudah melakukan ini, tetapi untuk kelengkapan:

    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;
    
  • ukuran tumpukan ulir

    Pertama, pastikan ini nol, dan bukan angka khusus (jika bukan 0, cari tahu mengapa, dan perbaiki):

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

    Tetapi Anda juga dapat melihat berapa banyak memori yang diambil oleh tumpukan thread menggunakan:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
    
  • Modul pihak ke-3 dimuat

    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 terkait memori

    Anda mungkin juga dapat menemukan sesuatu yang tidak biasa dengan melihat DMV ini:

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

Artikel ini ditulis sebelum SQL Server 2012, jadi beberapa nama kolom dan perhitungan mungkin harus disesuaikan, tetapi dapat memberikan beberapa jalan lain untuk dicoba juga:

Beberapa latar belakang yang bagus di artikel lain di situs itu juga:

Beberapa info bagus tentang jenis hal yang menggunakan memori di luar max server memory(tetapi tidak ada data yang baik tentang cara mengumpulkan penggunaan yang sebenarnya):


Terima kasih Aaron, server memiliki banyak memori yang tersedia Saya hanya ingin melihat apakah saya bisa mengetahui apa yang menggunakan 20GB itu. Apakah ada cara mengidentifikasi konsumsi memori dari Direct Windows Allocations atau Thread Stacks?
dbafromthecold

Saya sudah menjalankan skrip dan penghitung Stolen Server Memory (KB) pada 14GB. Akan menggali untuk melihat apakah saya bisa mendapatkan informasi lebih lanjut
dbafromthecold

Memori Server yang Dicuri tampaknya tidak menjadi masalah. Masih mencari
dbafromthecold

Meskipun bukan masalah di sini, perlu disebutkan bahwa Columnstore Object Pool (CACHESTORE_COLUMNSTOREOBJECTPOOL tipe petugas memori) ada di luar buffer pool juga. Lihat posting blog ini dari Niko Neugebauer
Blaž Dakskobler

@ BlažDakskobler ya, terima kasih, di memori juga. Saya akan memperbarui pos ketika saya memiliki kesempatan
Aaron Bertrand

3

Saya mendapat definisi di bawah ini dari Bob Dorr tentang apa memori server Max dalam kontrol SQL Server 2012. Anda juga dapat membaca Buku Daring untuk lebih jelasnya

Memori server maksimum mengontrol alokasi memori Server SQL, termasuk kumpulan buffer, kompilasi memori, semua cache, hibah memori qe, memori manajer kunci, dan memori CLR (pada dasarnya setiap "pegawai" seperti yang ditemukan di dm_os_memory_clerks). Memori untuk tumpukan thread, tumpukan memori, penyedia server tertaut selain SQL Server, atau memori apa pun yang dialokasikan oleh DLL "non SQL Server" tidak dikontrol oleh memori server maks.

Memori yang dialokasikan untuk untuk tumpukan benang, DLL pihak ketiga, penyedia server Linked yang selain Microsoft (seperti MySQL.PostgreSQL dll) atau DLL yang dimuat dalam ruang alamat SQL Server yang bukan SQL Server dialokasikan di luar memori server maks. Operasi cadangan IIRC di SQL Server 2012 juga masih mengalokasikan memori di luar buffer pool.

Apakah Anda menggunakan server tertaut untuk menanyakan RDBMS lain? Perangkat lunak lain yang diinstal pada mesin windows yang sama. Dapatkah Anda memposting di beberapa lokasi bersama output dari pertanyaan berikut

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

Bisakah Anda juga mengunggah DBCC MMEMORYSTATUShasil lengkap di beberapa lokasi bersama dan memposting tautan di sini. Ini akan membantu dalam memahami komponen apa yang mengambil memori

Sunting: Sesuai dengan keluaran status memori dbcc saya dapat melihat 2 NUMA node dan memori yang digunakan oleh setiap node adalah sekitar

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Sekali lagi jika Anda melihat Memory Manager dalam status memori output-nya

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

VM berkomitmen sebenarnya adalah Memori Virtual yang dilakukan oleh SQL Server dan karena memori ini berkomitmen itu physical memory backing it. Ini lagi yang membuat saya berpikir SQL Server menggunakan 65 G sebagaimana diatur dalam memori server maks

Inilah yang dimaksud dengan memori server maks. Jadi memori terdistribusi dengan baik antara kedua node, Anda juga dapat menambahkan output dari query query di bawah ini untuk memeriksa. Silakan tambahkan tangkapan layar

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

@DBAFromTheCold: Ini terlambat tetapi apakah Anda masih mencari jawaban, jika ya saya ingin memberikan satu lagi mencoba :) Dapatkah Anda memposting output lengkapselect * from sys.dm_so_process_memory
Shanky

Hai Shanky, terima kasih atas tanggapannya tetapi masalahnya telah teratasi dengan sendirinya. Tidak ada di bagian saya, SQL merilis memori sendiri. Saya memonitor server dan jika itu terjadi lagi, saya akan memposting pembaruan. Benar-benar ingin membahas hal ini.
dbafromthecold
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.