Neste documento, explicamos como analisar e otimizar uma instância do Cloud SQL para SQL Server quando é identificada pelo recomendador de instâncias subprovisionadas como tendo alto consumo de memória.
Memória do SQL Server
A memória do SQL Server pode ser dividida em:
Caches
Esses são objetos em um disco que podem ser recarregados, como páginas de bancos de dados e procedimentos armazenados. Como resultado, o SQL Server pode aumentar e diminuir esses objetos com base na utilização da memória. Os caches incluem pools de buffer e planos de cache.
Memória fixa
A memória fixa pode aumentar e diminuir. Só é reduzida quando não está em uso. Por exemplo, quando o número de conexões cai ou o número de consultas em execução diminui. Ela é diferente dos caches. Se não houver memória fixa suficiente, o SQL Server poderá ficar sem memória. A memória fixa inclui memória de conexão e concessões de memória.
Overhead do SQL Server
O overhead do SQL Server inclui linhas de execução e pilhas.
OLTP na memória
OLTP na memória inclui tabelas e grupos de arquivos na memória.
O consumo de memória pelo SQL Server é controlado pela configuração de maximum server memory
e memory.memory.limitmb
. O parâmetro memory.memory.limitmb
é definido automaticamente pelo Cloud SQL.
Para saber mais sobre memory.memory.limitmb
, consulte a documentação da Microsoft.
Defina o limite de max server memory
como um valor adequado. No SQL Server, se o max server memory
não estiver definido,
as páginas do banco de dados poderão consumir a maior parte da memória, chegando a 100%. Às vezes, isso pode ser confuso.
Opções de otimização de memória
Para determinar se uma instância precisa de mais ajuste de memória, faça o seguinte:
Defina o valor de
max server memory
. A recomendação geral é definir omax server memory
em cerca de 80% para evitar que o SQL Server consuma toda a memória disponível. Para instâncias com grandes quantidades de memória, 80% pode ser muito baixo e levar ao desperdício de memória.Monitorar
Page life expectancy
Page life expectancy
indica o tempo, em segundos, que a página mais antiga permanece no pool de buffer. Esse valor precisa ser maior que 300, conforme recomendado pela Microsoft. Se ela ficar abaixo de 300 de modo consistente, isso pode indicar que a instância está enfrentando uma alta utilização de memória. Execute a consulta a seguir para monitorarPage life expectancy
.SELECT [object_name], [counter_name], [cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Manager%' AND [counter_name] = 'Page life expectancy'
Verificar
Memory Grants Pending
Memory Grants Pending
especifica o número total de processos que aguardam uma concessão de memória do espaço de trabalho. Execute a consulta a seguir para verificarMemory Grants Pending
. Se essa consulta mostrar de forma consistente concessões pendentes, ela indica alta utilização da memória. É possível reduzir a consulta consultando as esperas do banco de dados e o ajuste de qualquer instrução que esteja aguardando na memória.SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending] FROM sys.dm_os_performance_counters WITH(NOLOCK) WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances AND counter_name = N'Memory Grants Pending'