Eu tenho um cluster Always On do SQL Server de 2 nós hospedando 3 instâncias do SQL Server e configurado da seguinte forma:
- A memória total do servidor é de 768 G para cada nó.
- O consumo de memória é de 98%.
- LPIM está ativado.
- A memória mínima do servidor da instância "A" é de 102 G, máx. de 512 G.
- A memória mínima do servidor da instância "B" é de 102 G, máx. de 490 G.
Recentemente, instalei uma nova instância "C" com memória mínima e máxima do servidor definida para 8G.
Parece que "C" está tendo muitos problemas em relação à memória disponível. Na inicialização:
Às vezes, a conexão ou AG falhou com a mensagem:
"Há memória de sistema insuficiente no pool de recursos 'interno' para executar esta consulta"
Referindo-se à documentação , existem várias causas relacionadas.
Meu primeiro palpite é que as instâncias "A" e "B" ainda estão pegando toda a memória disponível e, quando a nova instância é iniciada, o sistema operacional recupera uma parte dela.
Meu segundo palpite é que não há mais memória para essa nova instância no servidor, então a maior parte é enviada para o arquivo de paginação.
Gostaria de ter sua opinião sobre este assunto.
A única solução que vejo aqui é reconfigurar corretamente a memória máxima do servidor para cada instância e deixar algum espaço livre para o sistema operacional.
Tentei parar a instância "B", liberando muita memória e depois reiniciei minha instância recém-instalada. Há muita memória disponível no sistema operacional, mas o erro ainda está acontecendo.
Outro ponto que notei é que o atendente do SOSMEMMANAGER está pegando toda a memória.
As instâncias A e B liberarão memória quando o sistema estiver sob pressão de memória, mas não é instantâneo. Portanto, a instância C pode não conseguir alocar memória quando necessário. Então sim, a solução típica aqui é reduzir o Max Server Memory de cada instância para que as outras sempre tenham o suficiente para funcionar minimamente.
Além disso, você também deve definir o LPIM na instância C, para que sua memória não possa ser paginada. Não é uma bala de prata, mas é melhor para o SQL Server não conseguir alocar memória adicional do que ter sua memória já alocada paginada.
Você está superalocando memória no servidor, a memória máxima das instâncias A&B é de 1002 GB no total.
Você não informa quantas CPUs você tem para o servidor, mas se você tiver 8 núcleos, a memória máxima que você deve alocar no total deve ser em torno de 669.500 MB e menos se você tiver mais núcleos. Eu diminuiria um pouco o valor total alocado, pois os serviços de cluster e o AlwaysOn têm alguma sobrecarga extra
Portanto, se a instância C usar 8 GB de memória, você terá 661,308 MB restantes para jogar, fornecendo 317,427 MB para a instância B e 343,881 MB para a instância A, se mantivermos a mesma proporção entre as instâncias.