Eu tenho três instâncias de banco de dados SQL em um servidor em nuvem: A, B e C e a memória física instalada no servidor (RAM) é de 32 GB. O tamanho de A (dados + arquivo de log) é 44 GB e B (dados + arquivo de log) é de 41 GB. Ignoramos C, pois ele não possui bancos de dados e a memória máxima é de 500 MB.
Ambas as instâncias A e B têm sua memória definida para o tamanho padrão: 2147483647 MB. Embora não tenhamos tido problemas, isso definitivamente não é prático.
Após algumas pesquisas, com base na atividade do banco de dados, decidi que a alocação de memória da instância A deveria ser definida como 20 GB e B definida como 10 GB. No total 30/32 da memória física máxima no sistema. Abaixo mostra o consumo real de memória. Receio que se eu definir a memória máxima, isso diminuirá o tempo de resposta. Essa configuração é ideal para definir a memória do SQL Max Server para esses bancos de dados e como posso simular antes de aplicar?
Uma recomendação geral de Jonathan (de SQLSkills)
Você pode usar dbatools do powershell
Test-DbaMaxMemory
para calcular para você. O dbatools deveset-DbaMaxMemory
definir a memória máxima para você em todos os seus servidores.Eu iria
Test-DbaMaxMemory
verificar as recomendações primeiro e, quando estiver confortável, use set para configurá-lo em todos os seus servidores.O que você verá é que menos dados podem ser armazenados em cache e, portanto, algumas consultas terão desempenho desagregado. O valor padrão para RAM apenas, meio que significa que o SQL Server usará 'tudo o que puder'. Depois de subir, ele não voltará até que o serviço seja reiniciado, pois reserva toda essa RAM (porque armazena dados em cache).
Este é o meu recurso favorito para determinar quanta RAM um servidor realmente precisa. Meu único problema com isso é que ele realmente não leva em conta máquinas menores baseadas em VM e apenas assumiu que você PODE jogar 128 GB + em um servidor.
https://www.brentozar.com/archive/2014/05/much-memory-sql-server-need/
Uma regra geral é 10%, ou 8 GB, dedicado ao SO/Auxiliar, com o restante sendo dedicado ao SQL Server (por meio da configuração MAX Ram.) (10% ou 8 GB, o que for maior).
Na minha opinião, você não está deixando perto o suficiente para o sistema operacional: em um sistema de 32 GB, eu provavelmente deixaria 4 GB ou mais. Lembre-se de que logons locais, tarefas SQL e pacotes SSIS e software de backup de terceiros e similares usam memória fora do espaço alocado para o próprio mecanismo SQL. Se eu souber que há pacotes SSIS que consomem muita memória executados regularmente, deixarei ainda mais memória para o sistema operacional.
Como você divide o restante entre as 3 instâncias fica a seu critério. Não há risco (sério) de impacto alterando-os em tempo real, eles nem exigem uma reinicialização do SQL para entrar em vigor.
Não se preocupe com uma pequena diferença no tamanho máximo planejado em relação ao que você vê no gráfico. SQL é um porco e usará tanta memória quanto você der. Se você reduzir o máximo, ele terá que liberar um pouco de memória, mas está apenas abrindo mão de uma parte de seu cache de dados local. Pode ser necessário voltar ao disco um pouco mais cedo para algumas consultas, mas duvido que você notará uma diferença.
EDIT : Após alguma discussão nos comentários, não parece ser necessário reiniciar o SQL, mesmo quando o MaxMem é reduzido abaixo do valor atualmente usado .
Você fez uma análise para ver quanta memória real cada instância requer? Evite usar o Gerenciador de Tarefas para determinar os requisitos de memória SQL, existem métricas de desempenho adequadas a serem usadas para uso de memória SQL.