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: -
Dan inilah batas memori yang ditetapkan: -
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: -
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
Jadi ini tampaknya menunjukkan bahwa SQL Server menggunakan lebih dari 65GB yang ditetapkan.
sumber
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Jawaban:
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:
20 panitera terbaik
Anda sudah melakukan ini, tetapi untuk kelengkapan:
ukuran tumpukan ulir
Pertama, pastikan ini nol, dan bukan angka khusus (jika bukan 0, cari tahu mengapa, dan perbaiki):
Tetapi Anda juga dapat melihat berapa banyak memori yang diambil oleh tumpukan thread menggunakan:
Modul pihak ke-3 dimuat
DMV terkait memori
Anda mungkin juga dapat menemukan sesuatu yang tidak biasa dengan melihat DMV ini:
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):sumber
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 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
Bisakah Anda juga mengunggah
DBCC MMEMORYSTATUS
hasil lengkap di beberapa lokasi bersama dan memposting tautan di sini. Ini akan membantu dalam memahami komponen apa yang mengambil memoriSunting: Sesuai dengan keluaran status memori dbcc saya dapat melihat 2 NUMA node dan memori yang digunakan oleh setiap node adalah sekitar
Sekali lagi jika Anda melihat Memory Manager dalam status memori output-nya
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 maksInilah 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
sumber
select * from sys.dm_so_process_memory