Pourquoi SQL Server 2012 Express utilise-t-il 9,5 Go de RAM sur mon serveur?

22

Je crée une application dans laquelle j'ai l'intention d'incorporer SQL Server 2012 Express en tant que banque de données principale. Lors des tests sur ma machine de développement (Win7-32 ​​avec 3 Go de RAM), je n'ai jamais observé que le sqlservr.exeprocessus utilise plus de 1 Go de RAM comme je m'y attendais des limites de mise à l'échelle matérielle publiées pour l'édition Express de SQL Server.

J'ai ensuite déplacé mon application vers une machine de niveau serveur (Win Server 2008R2 64 bits avec 16 Go de RAM) pour évaluer ses performances et sqlservr.exej'ai été surpris de constater que le processus s'est rapidement étendu à environ 9,5 Go de RAM et y est resté.

Je l'ai redémarré plusieurs fois pour voir si cela aurait un effet, mais à chaque fois, le processus est rapidement revenu à ~ 9,5 Go. Maintenant, je suis certainement heureux que SQL Server Express utilise ma RAM, mais je voudrais savoir si c'est un comportement attendu afin de ne pas compter sur des niveaux de performances basés sur une utilisation incorrecte de la RAM.

Pour info, la version de SQL Server sur ma machine serveur, selon SELECT @@VERSION, est:

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)

Mon numéro de 9,5 Go provenait du numéro «Private Working Set» dans le Gestionnaire des tâches. Le premier tableau de sortie de DBCC memorystatus(quoique sur un serveur maintenant inactif) est ci-dessous:

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

Sortie de la requête suggérée de spaghettidba sur sys.dm_os_memory_clerks:

MEMORYCLERK_SQLBUFFERPOOL   1410
OBJECTSTORE_LOCK_MANAGER    256
MEMORYCLERK_SQLCLR          38
MEMORYCLERK_SOSNODE         26
CACHESTORE_SQLCP            11

plus ~ 10 entrées plus petites qui totalisent moins de 30 Mo.

Dan
la source

Réponses:

12

SQL Express est limité à 1 Go pour le pool de tampons, mais il existe de nombreux autres pools de mémoire dans SQL Server. Ce que je trouve surprenant, c'est l'utilisation excessive de pools de mémoire non tampon. Pour connaître l'utilisation de la mémoire par commis de mémoire, exécutez ceci:

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

J'espère que cela t'aides

spaghettidba
la source
Le résultat de cette requête est: MEMORYCLERK_SQLBUFFERPOOL 1410 OBJECTSTORE_LOCK_MANAGER 256 MEMORYCLERK_SQLCLR 38 MEMORYCLERK_SOSNODE 26 CACHESTORE_SQLCP 11 Et puis quelques autres plus petites qui totalisent <30 Mo. Cela me semble étrange. -arg- au formatage du commentaire.
Dan
Hmmm. MEMORYCLERK_SQLBUFFERPOOL à lui seul dépasse la limite de 1 Go, nous pourrions donc être confrontés à un bogue. Ce que je trouve bizarre, c'est comment il utilise 9,5 Go sans qu'il apparaisse dans la requête.
spaghettidba
Je pense qu'il y a d'autres colonnes intéressantes dans sys.dm_os_memory_clerks (à côté de single_pages_kb): virtual_memory_committed_kb semble plus pertinent dans le cas de MEMORYCLERK_SQLBUFFERPOOL.
Razvan Socol