Coloquei o SQL Server 2012 Standard em uma máquina virtual (VMWare) que possui aproximadamente 98 GB de memória.
Agora verifiquei a consulta abaixo sobre quanta memória é usada pelo SQL Server.
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
E veja que ele já comeu 81 GB de memória e a memória máxima está definida para ~ 90 GB.
Usando:
select (physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 ) VAS from sys. dm_os_process_memory
O SQL Server 2012 Standard deve suportar apenas 64 GB de memória.
Por que meu SQL Server come mais do que pode? Ou a informação está incorreta?
Qualquer ideia? Isso está relacionado a uma máquina virtual usando memória virtual?
Não sei se o driver de balão está ativado no VM Host...
Se precisar de mais alguma informação eu adiciono.
O limite de 64 GB (e 128 GB em 2014) se aplica apenas ao buffer pool. O artigo da KB " Configuração de memória e considerações de dimensionamento no SQL Server 2012 " diz:
E como todos sabemos,
max server memory
também não controla toda a memória do SQL Server. A documentação oficial está em processo de atualização para fornecer as seguintes orientações sobre isso (essa redação exata foi fornecida por Bob Ward):Portanto, é bastante provável que você veja
sqlservr.exe
usar mais de 64 GB de memória se houver alocação significativa para qualquer coisa que não seja o buffer pool, mesmo na Standard Edition (e mais de 1 GB, mesmo na Express Edition).Se você quiser impedir que o SQL Server use mais de 64 GB de memória, precisará definir
max server memory
algo menor que 64 GB (talvez seja necessário experimentar aqui para encontrar a combinação certa, mas entenda que a memória do pool sem buffer pode flutuar , então você ainda pode ver coisas que se aventuram além do limite de licenciamento e do limite configurado).Ou , você pode simplesmente deixá-lo como está e agradecer por poder usar até 64 GB para buffer pool e muito mais para outras coisas que poderiam reduzir o uso do buffer pool se o limite de 64 GB fosse um limite rígido imposto.
Você pode ver como a memória é distribuída de várias maneiras. Entre os secretários de memória, você pode usar:
Na maioria dos casos, o principal consumidor será
MEMORYCLERK_SQLBUFFERPOOL
, mas você também deve ver um volume significativo deCACHESTORE_*
entradas. Você pode agrupá-lo em um nível superior usando algo como:Para ver como a memória do cache/armazenamento do usuário é distribuída:
Atualmente, em minha humilde VM, a consulta em sua pergunta (fornecida por @Shanky) diz que o SQL Server está usando 2.085 MB de memória (com 2.004 MB bloqueados na memória). No entanto, minha consulta acima contra os funcionários de memória DMV diz que a memória total usada é de apenas 1.793 MB.
A consulta na resposta de Chris diz que o total é 2.054 MB, com uma meta de 3.072 MB (isso ocorre porque defini explicitamente
max server memory
como 3.072 MB).Então, onde estão os ~ 200 MB extras? Quem sabe. (Também posso ver essa diferença se comparar
total server memory
comProcess > sqlservr > Private Bytes
o Monitor de desempenho.) Eu poderia começar a analisar a saída deDBCC MEMORYSTATUS
para tentar juntá-la (e Tim Chapman escreveu alguns PowerShell para tornar isso mais fácil ), mas vale a pena? Toda a memória é relatada lá? Não tenho 100% de certeza de que seja (ou que você deva usar a saída em um sistema NUMA), ou que qualquer DMV possa fornecer uma imagem totalmente precisa de toda a memória usada pelo SQL Server. Eu também não acredito que todos os tipos de secretários de memória estejam documentados em qualquer lugar - então, mesmo que isso forneça uma imagem completa, você ainda pode estar coçando a cabeça sobre o que os resultados realmente significam.O Gerenciador de Tarefas, entretanto, diz que
sqlservr.exe
está usando apenas 42 MB. Faça o que fizer, pare de usar o Gerenciador de Tarefas. Para qualquer coisa, realmente. Sei que você removeu esse detalhe de sua pergunta em sua edição mais recente, mas não posso enfatizar o suficiente como é inútil para mostrar o uso de memória do SQL Server.De acordo com a resposta de Aaron Bertrand ( veja rapidamente quanta RAM está alocada para o SQL Server? ). O Gerenciador de Tarefas não deve ser usado para verificar quanta memória o SQL está realmente usando.
Prefiro usar a seguinte consulta (novamente, obrigado Aaron):
Como alternativa, usar
DBCC MEMORYSTATUS
fornecerá essas informações (assim como uma série de informações adicionais).Acho que esta consulta me dá uma memória real total mais precisa em uso -
Eu aprecio o post é antigo, mas isso pode ser útil.
Eu tenho uma instância de 2012 std, que está usando 120 Gb de RAM no total