Por que o SQL Server 2012 Express usa 9,5 GB de RAM no meu servidor?

22

Estou criando um aplicativo no qual planejo incorporar o SQL Server 2012 Express como o armazenamento de dados principal. Ao testar em minha máquina de desenvolvimento (Win7-32 ​​com 3 GB de RAM), nunca observei o sqlservr.exeprocesso usar mais de 1 GB de RAM, como seria de esperar dos limites de escala de hardware publicados para a edição Express do SQL Server.

Em seguida, mudei meu aplicativo para uma máquina de servidor (Win Server 2008R2 de 64 bits com 16 GB de RAM) para avaliar seu desempenho lá e fiquei surpreso ao descobrir que o sqlservr.exeprocesso expandiu rapidamente para aproximadamente 9,5 GB de RAM e ficou lá.

Eu o reiniciei algumas vezes para ver se isso teria algum efeito, mas a cada vez, o processo retornava rapidamente para ~ 9,5 GB. Agora, certamente, tenho o prazer de ter o SQL Server Express usando minha RAM, mas gostaria de saber se esse é o comportamento esperado, para que eu não dependa de níveis de desempenho baseados no uso incorreto da RAM.

FYI, a versão do SQL Server na minha máquina servidor, de acordo com SELECT @@VERSION, é:

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)

Meu número de 9,5 GB veio do número "Private Working Set" no Gerenciador de tarefas. A primeira tabela de saída de DBCC memorystatus(embora em um servidor agora ocioso) esteja abaixo:

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

Saída da consulta sugerida por spaghettidba em sys.dm_os_memory_clerks:

MEMORYCLERK_SQLBUFFERPOOL   1410
OBJECTSTORE_LOCK_MANAGER    256
MEMORYCLERK_SQLCLR          38
MEMORYCLERK_SOSNODE         26
CACHESTORE_SQLCP            11

mais ~ 10 entradas menores que somam menos de 30 MB.

Dan
fonte

Respostas:

12

O SQL Express é limitado a 1 GB para o buffer pool, mas existem muitos outros pools de memória no SQL Server. O que acho surpreendente é o uso excessivo de conjuntos de memória sem buffer. Para descobrir o uso de memória por funcionário de memória, execute o seguinte:

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

Espero que isto ajude

spaghettidba
fonte
A saída dessa consulta é: MEMORYCLERK_SQLBUFFERPOOL 1410 OBJECTSTORE_LOCK_MANAGER 256 MEMORYCLERK_SQLCLR 38 MEMORYCLERK_SOSNODE 26 CACHESTORE_SQLCP 11 E depois mais algumas pequenas que somam <30 MB. Parece estranho para mim. -arg- na formatação do comentário.
Dan
Hummm. Somente MEMORYCLERK_SQLBUFFERPOOL vai além do limite de 1 GB, portanto, podemos estar enfrentando um bug. O que eu acho estranho é como ele está usando 9,5 GB sem ele aparecer na consulta.
Spaghettidba
Eu acho que existem outras colunas interessantes em sys.dm_os_memory_clerks (ao lado de single_pages_kb): virtual_memory_committed_kb parece mais relevante no caso de MEMORYCLERK_SQLBUFFERPOOL.
Razvan Socol