Mengapa SQL Server 2012 Express menggunakan 9.5GB RAM di server saya?

22

Saya membangun aplikasi di mana saya berencana untuk menanamkan SQL Server 2012 Express sebagai datastore utama. Saat menguji pada mesin pengembangan saya (Win7-32 ​​dengan 3GB RAM), saya tidak pernah mengamati sqlservr.exeproses untuk menggunakan lebih dari 1GB RAM seperti yang saya harapkan dari batas skala perangkat keras yang diterbitkan untuk SQL Express edisi Express.

Saya kemudian pindah aplikasi saya ke mesin kelas server (Win Server 2008R2 64-bit dengan RAM 16GB) untuk mengevaluasi kinerjanya di sana dan terkejut menemukan bahwa sqlservr.exeproses cepat berkembang menjadi sekitar 9,5GB RAM dan tinggal di sana.

Saya menyalakannya kembali beberapa kali untuk melihat apakah itu akan berpengaruh, tetapi setiap kali, prosesnya dengan cepat kembali ke ~ 9.5GB. Sekarang saya tentu senang SQL Server Express menggunakan RAM saya, tetapi saya ingin tahu apakah ini perilaku yang diharapkan sehingga saya tidak mengandalkan tingkat kinerja yang didasarkan pada penggunaan RAM yang tidak benar.

FYI, versi SQL Server di mesin server saya, menurut SELECT @@VERSION, adalah:

Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 
    Oct 19 2012 13:38:57 
    Copyright (c) Microsoft Corporation
    Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Nomor 9.5GB saya berasal dari nomor "Private Working Set" di Task Manager. Tabel keluaran pertama dari DBCC memorystatus(meskipun pada server yang sekarang tidak digunakan) adalah di bawah ini:

PROCESS/SYSTEM COUNTS
Available Physical Memory   5543616512
Available Virtual Memory    8734902411264
Available Paging File       22471094272
Working Set                 9664200704
Percent of Committed Memory in WS   99
Page Faults                 2627510
System physical memory high 1
System physical memory low  0
Process physical memory low 0
Process virtual memory low  0

Output dari permintaan spaghettidba yang disarankan pada sys.dm_os_memory_clerks:

MEMORYCLERK_SQLBUFFERPOOL   1410
OBJECTSTORE_LOCK_MANAGER    256
MEMORYCLERK_SQLCLR          38
MEMORYCLERK_SOSNODE         26
CACHESTORE_SQLCP            11

plus ~ 10 entri lebih kecil yang jumlahnya kurang dari 30MB.

Dan
sumber

Jawaban:

12

SQL Express terbatas hingga 1GB untuk Buffer Pool, tetapi ada banyak kumpulan memori lain di SQL Server. Apa yang saya temukan mengejutkan adalah penggunaan kolam memori non-buffer yang berlebihan. Untuk mengetahui penggunaan memori per petugas memori, jalankan ini:

SELECT type, SUM(pages_kb)/1024 AS MemoryMB
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY 2 DESC

Semoga ini membantu

spaghettidba
sumber
Output dari query itu adalah: MEMORYCLERK_SQLBUFFERPOOL 1410 OBJECTSTORE_LOCK_MANAGER 256 MEMORYCLERK_SQLCLR 38 MEMORYCLERK_SOSNODE 26 CACHESTORE_SQLCP 11 Dan kemudian beberapa yang lebih kecil yang berjumlah <30MB. Sepertinya aneh bagiku. -arg- di format komentar.
Dan
Hmmm. MEMORYCLERK_SQLBUFFERPOOL saja melampaui batas 1GB, jadi kami mungkin menghadapi bug. Apa yang saya temukan aneh adalah bagaimana menggunakan 9.5GB tanpa itu muncul di kueri.
spaghettidba
Saya pikir ada beberapa kolom menarik lainnya di sys.dm_os_memory_clerks (di samping single_pages_kb): virtual_memory_committed_kb tampaknya lebih relevan dalam kasus MEMORYCLERK_SQLBUFFERPOOL.
Razvan Socol