Consumo de memória do SQL Server 2012 fora do buffer pool

10

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: -

saída de DBCC MEMORYSTATUS

E aqui está o limite de memória definido: -

captura de tela do limite de memória

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: -

MemoryClerkOutput

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

Screenshot de PhysMemInUse

Portanto, isso parece indicar que o SQL Server está usando mais do que o conjunto de 65 GB.

dbafromthecold
fonte
O que isso gera? SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC;?
Aaron Bertrand
Olá Aaron, obrigado por responder. Eu vou atualizar a questão com a saída agora
dbafromthecold

Respostas:

11

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:

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
  • 20 melhores funcionários

    Você já fez isso, mas para completar:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
  • 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):

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';

    Mas você também pode ver quanta memória está sendo absorvida pelas pilhas de threads usando:

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
  • Módulos de terceiros carregados

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
  • DMVs relacionadas à memória

    Você também pode encontrar algo fora do comum observando esses DMVs:

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;

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):

Aaron Bertrand
fonte
Obrigado Aaron, o servidor tem muita memória disponível. Só queria ver se conseguia descobrir o que estava usando esses 20 GB. Existe uma maneira de identificar o consumo de memória de alocações diretas do Windows ou pilhas de threads?
precisa saber é o seguinte
Eu tenho os scripts de execução e o contador de Memória de servidor roubada (KB) está em 14 GB. Indo para cavar para ver se posso obter mais informações
dbafromthecold
Memória roubada do servidor não parece ser o problema. Ainda procurando
dbafromthecold
Embora não seja o problema aqui, vale mencionar que o Conjunto de Objetos Columnstore (tipo caixeiro de memória CACHESTORE_COLUMNSTOREOBJECTPOOL) está fora do buffer pool também. Veja esta publicação no blog de Niko Neugebauer
Blaž Dakskobler
@ BlažDakskobler sim, obrigado, também na memória. Vou atualizar o post quando tiver uma chance
Aaron Bertrand
3

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 máxima do servidor controla a alocação de memória do SQL Server, incluindo o pool de buffers, a memória de compilação, todos os caches, as concessões de memória qe, a memória do gerenciador de bloqueios e a memória CLR (basicamente qualquer "funcionário", conforme encontrado em dm_os_memory_clerks). A memória para pilhas de encadeamentos, heaps de memória, provedores de servidores vinculados que não sejam o SQL Server ou qualquer memória alocada por uma DLL "não SQL Server" não é controlada pela memória máxima do servidor.

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

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

Você também pode fazer o upload da DBCC MMEMORYSTATUSsaída completa em algum local compartilhado e postar o link aqui. Isso ajudaria a entender qual componente está consumindo memória

Edit: 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

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

Novamente, se você vir o Gerenciador de Memória no estado da memória,

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

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

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Shanky
fonte
@DBAFromTheCold: Está atrasado, mas você ainda está procurando resposta, se sim, eu quero tentar mais uma vez :) Você pode postar uma saída completa de #select * from sys.dm_so_process_memory
Shanky
Olá Shanky, obrigado pela resposta, mas o problema foi resolvido. Nada da minha parte, o SQL liberou a memória por conta própria. Estou monitorando o servidor e, se ocorrer novamente, publicarei uma atualização. Realmente quero chegar ao fundo disso.
precisa saber é o seguinte