Eu tenho uma instância do SQL Server 2012 SP2 Enterprise Edition que consome ~ 20 GB de memória maior que o máximo. limite de memória. A instância é limitada a 65 GB, mas a memória física em uso na consulta abaixo mostra 86 GB
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
O servidor é físico com 2 nós NUMA. Existe uma maneira de descobrir o que está consumindo a memória fora do pool de buffers (estou assumindo que é isso que está acontecendo)?
Aqui está a saída do DBCC MEMORYSTATUS: -
E aqui está o limite de memória definido: -
Desde já, obrigado.
UPDATE: - Eu executei a consulta que Aaron sugeriu
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
Aqui está a saída: -
O total de pages_kb chega a ~ 60 GB
ATUALIZAÇÃO 2: - A saída completa do DBCC MEMORYSTATUS está aqui: - http://pastebin.com/nGn6kXEc
ATUALIZAÇÃO 3: - Saída dos scripts de Shanky no arquivo excel aqui: - http://jmp.sh/LKRlH4K
ATUALIZAÇÃO 4: - Captura de tela da saída de: -
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Portanto, isso parece indicar que o SQL Server está usando mais do que o conjunto de 65 GB.
fonte
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;
?Respostas:
Controles de memória máxima do servidor tampão piscina e todas as alocações de tamanho de página, mas ainda não controla coisas como atribuições diretas do Windows (servidores ligados, sp_OA, XPS), memória necessária para fios / pilhas de rosca, etc .
Você provavelmente pode esperar que isso seja mais alto no NUMA (embora não tenha certeza de que 20 GB seja normal); o ponto é que você não pode esperar que a memória máxima do servidor controle totalmente a memória usada por uma instância do SQL Server. Se você deseja que a instância inteira (não apenas buffer pool, planeje caches e CLR) use no máximo 64 GB, configure a memória máxima do servidor para algo menor.
Algumas idéias em potencial para rastrear isso (vou normalizar tudo para MB):
contadores de desempenho
Veja se algo salta aqui como excessivamente grande:
20 melhores funcionários
Você já fez isso, mas para completar:
tamanho da pilha de threads
Primeiro, verifique se é zero e não um número personalizado (se não for 0, descubra o porquê e corrija-o):
Mas você também pode ver quanta memória está sendo absorvida pelas pilhas de threads usando:
Módulos de terceiros carregados
DMVs relacionadas à memória
Você também pode encontrar algo fora do comum observando esses DMVs:
Este artigo foi escrito antes do SQL Server 2012, portanto, alguns nomes e cálculos de coluna podem precisar ser ajustados, mas podem fornecer outros caminhos para tentar também:
Alguns bons antecedentes em outro artigo nesse site também:
Algumas informações boas sobre os tipos de coisas que usam memória fora de
max server memory
(mas nenhum dado bom sobre como coletar o uso real):fonte
Eu obtive abaixo a definição de Bob Dorr sobre o que a memória máxima do servidor no SQL Server 2012 controla. Você também pode ler os Manuais Online para obter mais detalhes
A memória alocada para a pilha de threads, DLL de terceiros, provedor de servidor vinculado que não seja da Microsoft (como MySQL.PostgreSQL etc.) ou qualquer DLL carregada no espaço de endereço do SQL Server que não seja o SQL Server é alocada fora da memória máxima do servidor. A operação de backup do IIRC no SQL Server 2012 também ainda está alocada de memória fora do buffer pool.
Você está usando um servidor vinculado para consultar outro RDBMS? Qualquer outro software instalado na mesma máquina Windows. Você pode postar em algum local compartilhado a saída das seguintes consultas
Você também pode fazer o upload da
DBCC MMEMORYSTATUS
saída completa em algum local compartilhado e postar o link aqui. Isso ajudaria a entender qual componente está consumindo memóriaEdit: Conforme a saída do estado da memória dbcc, posso ver 2 nós NUMA e a memória utilizada por cada nó é de aproximadamente
Novamente, se você vir o Gerenciador de Memória no estado da memória,
A VM confirmada é, na verdade, a Memória Virtual confirmada pelo SQL Server e, como essa memória está comprometida, ela possui
physical memory backing it
. Isso novamente, o que me faz pensar que o SQL Server está usando 65 G, conforme definido na memória máxima do servidorÉ isso que é a memória máxima do servidor. Portanto, a memória é bem distribuída entre os dois nós. Você também pode adicionar a saída da consulta abaixo para verificar. Por favor, adicione a captura de tela
fonte
select * from sys.dm_so_process_memory