Memória SQL Server

Oct 25 2020

É a respeito da memória do SQL Server. Quando o servidor está ficando sem memória, recomendamos adicionar mais memória ao hardware para superar os problemas de utilização da CPU.

Mas antes de prosseguir com a atualização da memória, como parte da solução de problemas, como verificamos / calculamos a memória SQL que está consumida atualmente na instância.

Por exemplo:

NOME DO SERVIDOR: XXXXXXXXXXXXX

Memória física instalada (RAM): 64,0 GB

Memória do SQL Server atualmente alocada: 58.982 MB -> 58.982 GB

Neste caso, temos apenas uma instância (MSSQLSERVER) no servidor e 80% da memória foi alocada para a instância de acordo com o padrão. E 20% é alocado para aplicativos e sistemas operacionais.

Quando verificamos o Monitor de Recursos, ele mostrará 80% de preenchimento, pois configuramos a Memória do SQL Server para isso.

Mas isso não significa que 80% do SQL seja totalmente utilizado, pois o SQL manterá algum espaço no buffer no backend. Quando surfei, obtive a fórmula abaixo para calcular a memória SQL consumida na instância, mas esses parâmetros foram removidos na ferramenta de monitor de desempenho há muito tempo.

Existe uma maneira de verificar, atualmente, quanto o SQL utiliza de 80% (OR) em quais métricas podemos proceder com o upgrade de memória.

FÓRMULA PARA CALCULAR A MEMÓRIA SQL: (Os parâmetros abaixo foram removidos do Monitor de Desempenho)

*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB

Respostas

3 Shanky Oct 26 2020 at 09:51

como verificamos / calculamos a memória SQL atualmente consumida na instância.

Isso é muito simples de fazer. Você tem DMV sys.dm_os_process_memory que fornecerá as informações. Vai te dar physical memory usedetotal memory used (RAM+Page file)

    select (physical_memory_in_use_kb/1024) as Phy_Mem_used_MB, (virtual_address_space_committed_kb/1024) as Total_mem_Used_MB
   from sys.dm_os_process_memory

Mas isso não significa que 80% do SQL seja totalmente utilizado, pois o SQL manterá algum espaço no buffer no backend

Assim que o SQL Server atingir o valor máximo de memória do servidor, ele manterá essa memória, a menos que a notificação de memória insuficiente solicite a liberação de memória. Então, sim, pode não estar usando tudo, mas ainda assim irá mantê-lo. Isso é chamado de cache, pois ajuda a evitar falhas de página física.

Existe uma maneira de verificar, atualmente, quanto o SQL utiliza de 80% (OR) em quais métricas podemos proceder com o upgrade de memória.

Como eu disse uma vez, utilizado ele mostrará toda a memória utilizada, mesmo quando não precisa dessas páginas no processamento de consulta. Quando uma nova solicitação chegar, essas páginas serão removidas para criar espaço para novas páginas.

2 TiborKaraszi Oct 26 2020 at 12:18

Como você define "utilizado"? Uma página que foi lida no cache um segundo atrás, isso seria contado como utilizado? Um minuto atrás? Uma hora? Uma semana?

A questão é que não existem coisas como "utilizadas". O servidor SQL mantém páginas (e outras coisas) na memória. Quando há pressão de memória (interna ou externa), um mecanismo tradicional de envelhecimento do cache (basicamente) é usado para remover coisas que foram usadas menos recentemente. Há muito mais detalhes sobre o manuseio da memória (cache), é claro, mas, em princípio, é tratado como qualquer mecanismo de cache.

Portanto, conceitos como "utilizado" ou configuração ideal simplesmente não existem. Você pode ver se há muita memória não sendo usada pelo servidor SQL, é claro. Mas quando o servidor SQL aloca memória, ele fica preso a ela, a menos que haja pressão de memória. Quem sabe, talvez alguém precise dessa página no próximo segundo?

Você pode reduzir a memória máxima do servidor e ver quando seu desempenho começa a prejudicar, por exemplo.

2 AlekseyVitsko Oct 26 2020 at 16:09

Use o MemoryManagerInfoprocedimento armazenado, que pode ser encontrado aqui:

https://github.com/aleksey-vitsko/Database-Administrator-Tools

Ele fornece um bom detalhamento de como o SQL Server usa a memória atualmente :
Veja o exemplo na imagem abaixo - isto é o que meu servidor está consumindo atualmente:

Aproximadamente, Total Server Memory= Database Cache Memory+ Free Memory+ Stolen Server Memory(memória roubada do servidor inclui cache de plano, bloqueios, etc.)