SQL Server 2008 R2 "Memori Hantu"?

12

Kami memiliki mesin SQL Server 2008 R2 khusus yang mengalami beberapa masalah memori aneh .. Mesin itu sendiri memiliki banyak sumber daya termasuk dua prosesor quad-core, 16 GB RAM dan 64bit Windows Server 2008 R2 Enterprise (ini adalah Dell PowerEdge 2950) .

Masalah aneh adalah bahwa sistem ini melaporkan 82% dari memori yang digunakan tetapi sqlservr.exe hanya melaporkan 155mb yang digunakan. Alasan yang saya duga SQL Server adalah masalahnya adalah karena jika saya me-restart proses sqlservr.exe konsumsi memori kembali normal untuk jangka waktu tertentu.

Adakah yang punya ide tentang bagaimana saya bisa mulai melacak masalah ini?

Terima kasih, Jason

typefragger
sumber
3
Apakah Anda menggunakan pengguna Lock Pages di Memory? Jika demikian, memori yang terkunci tidak akan dilaporkan oleh pengelola tugas. Lihat blogs.technet.com/b/askperf/archive/2008/03/25/… untuk info lebih lanjut.
Mark S. Rasmussen
Kami memiliki pengguna Kunci Halaman di Memori yang ditetapkan ke "Tidak Ada". Kami juga memiliki pengaturan "Memori server maksimum (dalam MB)" pada int.MaxValue bawaannya - menurut Anda apakah itu dapat menyebabkan masalah?
typefragger
4
Satu-satunya waktu saya khawatir adalah ketika server sql saya menggunakan KURANG dari 82%!
SqlACID

Jawaban:

15

Anda tidak akan mendapatkan gambaran yang benar tentang penggunaan memori dari Task Manager jika akun yang menjalankan layanan memiliki halaman kunci dalam hak istimewa memori (edit: sesuai komentar / tautan Mark Rasmussen). Untuk menentukan berapa banyak memori yang digunakan, Anda dapat melihat:

  • SQLServer: Penghitung perfom Memori \ Total Server Memori
  • DMV

Saya tidak ingat apakah ada DMV atau kombinasi yang akan memberi Anda alokasi memori total tetapi yang berikut akan menunjukkan sebagian besar.

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);

Yang kedua adalah yang paling menarik biasanya, alokasi buffer pool oleh database. Di sinilah bagian singa akan digunakan dan dapat berguna untuk memahami yang mana dari basis data Anda yang merupakan konsumen terbesar.

Mark Storey-Smith
sumber
Wow, terima kasih banyak! Ini (terutama yang kedua) membuatnya sangat jelas bagi saya!
typefragger
8

Ada artikel terbaru dari Brent Ozar kita sendiri yang menangani kasus ini, ketika Task Manager tidak menunjukkan dengan benar memori yang dimakan oleh SQLServer dan layanan tambahannya. Anda dapat menemukannya di sini: Panduan Sysadmin untuk Memori Microsoft SQL Server .

Kutipan: " Mengapa SQLServer.exe Tidak Menggunakan Banyak Memori?

Ketika Anda remote desktop ke server dan melihat Task Manager, Penggunaan Mem sqlservr.exe selalu tampak aneh. Itu bukan kesalahan SQL Server. Task Manager adalah pembohong yang kotor dan kotor. (Saya tahu, kedengarannya seperti orang SQL itu yang menyalahkan, tetapi bersabarlah sebentar.) Pada kotak 64-bit, angka ini agak lebih akurat, tetapi pada kotak 32-bit, itu hanya benar-benar tidak masuk akal . Untuk benar-benar mendapatkan gambaran yang akurat tentang berapa banyak memori yang digunakan SQL Server, Anda memerlukan alat seperti Process Explorer, dan Anda perlu mengidentifikasi semua proses SQL Server. Di server saya tunjukkan di kanan, ada dua contoh SQL Server (ditunjukkan oleh sqlservr.exe), ditambah SQL Agent, SQL Browser, dan alat cadangan SQL Server. Sudah biasa juga melihat Layanan Analisis SQL Server, Layanan Integrasi, dan Layanan Pelaporan juga berjalan di server yang sama - yang semuanya menghabiskan memori.

Jadi berapa banyak memori yang digunakan SQL? Saya akan membuat ini mudah bagi Anda. SQL Server menggunakan semua memori. Titik."

Jadi saya akan menyarankan Anda untuk mencoba permintaan Markus dan menggunakan alat yang lebih baik untuk laporan memori. Atau hanya percaya Perfmon untuk melaporkan memori, bukan Pengelola Tugas.

Marian
sumber
-2

Jumlah memori yang digunakan oleh SQL, seperti yang ditunjukkan di task manager, sebagian besar akan menjadi pengaturan max-memory. Ini adalah cara kerja pengaturan min / max:

Ketika SQL server mulai, itu mulai mengambil memori hingga pengaturan min-memory. Ketika kebutuhan SQL Anda meningkat, SQL akan mulai menggunakan lebih banyak memori hingga pengaturan max-memory. Memori kemudian tetap pada titik ini (maks) bahkan ketika penggunaan SQL turun. Ini memberi kesan SQL melakukan tugas besar dan menghabiskan banyak memori. Pada kenyataannya, memori ini disediakan oleh SQL.

Ketika ada tekanan memori non-SQL di server, SQL akan melepaskan memori ke titik pengaturan min-memori. Ini adalah bagaimana pengaturan memori digunakan. Anda bisa menggunakan skrip Mark untuk melihat bagaimana SQL menggunakan memori ini.

StanleyJohns
sumber
1
Min / maks mengatur alokasi buffer pool, tidak lebih. Ini adalah baris pertama dalam deskripsi Opsi Memori Server dalam BOL. Pengaturan sama sekali tidak ada hubungannya dengan yang ditampilkan di task manager. Deskripsi Brent tentang taskmgr sebagai "pembohong yang kotor dan kotor" meringkas situasinya sebaik yang saya baca.
Mark Storey-Smith
@ MarkStorey-Smith tolong baca konten lebih lanjut di tautan dalam komentar Anda, itu hanya menjelaskan poin saya. Manajer tugas menunjukkan penggunaan sumber daya sistem. Buffer pool bukan sumber daya sistem. Saya menjelaskan tentang apa yang dimaksud dengan penggunaan memori oleh SQL dalam task manager. Anda menyatakan yang jelas dengan menyebutkan buffer pool, tetapi itu masih tidak membuktikan saya salah.
StanleyJohns
Tidak yakin bagaimana lebih baik untuk menempatkan ini ... "Jumlah memori yang digunakan oleh SQL, seperti yang ditunjukkan pada task manager, sebagian besar akan menjadi pengaturan max-memory. Ini adalah bagaimana pengaturan min / max bekerja" .. tidak 't.
Mark Storey-Smith
'Ini adalah cara kerja pengaturan min / maks:' Ada titik dua di bagian akhir yang berarti penjelasan berikut, bukan yang menegaskan kalimat sebelumnya. :)
StanleyJohns
1
Saya dengan Mark. Baca blog Slava Oks : dia adalah bagian dari tim MS yang menulis manajer memori. Buka tajuk "kolam penyangga". Saya kutip "Ingat SQL Server memiliki dua pengaturan memori yang dapat Anda kontrol menggunakan sp_conifigure. Mereka adalah server max dan memori min. Saya tidak yakin apakah Anda tahu tetapi kedua pengaturan ini benar-benar mengontrol ukuran buffer pool. Mereka tidak mengontrol keseluruhan jumlah memori fisik yang dikonsumsi oleh SQL Server "
gbn