Eu me pergunto por que o SQL Server não usa toda a memória disponível - 100% quando tenho certeza de que há um gargalo de memória. Por exemplo, um servidor que administro começa usando 91% da memória e aumenta gradualmente até 98, mas não 100. A tendência de aumento é a seguinte após uma reinicialização às 23:00:
- 58% após o reinício e chega a 79% ao longo da noite. Suponho que isso se deva aos backups noturnos feitos.
- 82% às 11:00 do dia seguinte.
- 90% até 12:00
- Uma tendência constante ao longo do dia até as 23:00, quando a utilização da memória aumenta para 93%
- 95% na manhã seguinte às 08:00
- 97% às 17:00
- 98% no dia seguinte às 14:00 e fica lá.
O que pode estar fazendo com que 2% não sejam utilizados? É possível que o sistema operacional Windows esteja impedindo isso? Em caso afirmativo, como posso provar que, de fato, o Windows está guardando isso para si mesmo?
Refiro-me ao uso geral de memória pelo servidor - ou seja, o sistema operacional. A configuração de memória máxima já está definida bem além da memória atual do servidor. Tenho uma ferramenta de monitoramento em mãos para rastrear a utilização da memória.
A utilização da memória pelo servidor não é inferior nem superior a 98%. Este é um SQL Server dedicado, de instância única e com dois bancos de dados, no qual nenhum outro serviço, aplicativo etc. está sendo executado. O SQL Server pode estar usando a maior parte da memória alocada - ou seja, 98% - mas minha pergunta é por que ele não está usando os 2% restantes? Não tenho certeza se estou ficando muito rabugento ao questionar esses 2%?
Graças à consulta Determinando a alocação de memória atual no uso da memória do monitor, confirmo que Memory_usedby_Sqlserver_GB é 60 de 64 GB de RAM total. Não consegui encontrar a coluna max server memory
e a RAM total na saída do sys.dm_os_process_memory
DMV (talvez devido ao SQL Server 2008 R2), mas posso confirmar que é um servidor de 64 GB e máx. a memória do servidor é definida como 2147483647 MB.
Não sei se meu servidor utilizará alguma memória extra depois que eles forem colocados nos slots. Estou tentando provar se o servidor precisa de mais memoria, (se sim) vai fazer uso dela e assim fazer um motivo para empurrar para compra. Ficarei em uma posição desconfortável se a memória for comprada e a utilização da memória não aumentar e permanecer em seu estado atual - 60 GB. Ver 60 GB de RAM sendo utilizados depois de aumentar a memória do servidor de 64 GB para 128 GB será um desperdício de dinheiro. Quero ter certeza antes do fato se o servidor se beneficiará com as novas RAMs extras ou será indiferente.
Tudo requer memória, incluindo o sistema operacional, assim como o SQL Server. O sistema operacional pode remover a memória do SQL Server, a menos que você tenha páginas bloqueadas nas permissões de memória do SQL Server. No entanto, mesmo assim, o sistema operacional sempre vencerá para se manter funcionando; portanto, se precisar de memória, forçará o SQL Server a desistir.
Além disso, só porque o SQL Server puxou até 98% da memória não significa necessariamente que está usando tudo. Você teria que se aprofundar no uso de memória do próprio SQL Server para saber o que ele está fazendo com tudo isso. Ele o mantém até que o sistema operacional o solicite de volta, com força ou de maneira agradável.
Também observarei que você não deve ter a memória máxima definida "bem além da capacidade de memória atual do servidor". O SQL Server pensando que pode pegar mais memória do que realmente existe pode causar problemas de desempenho. A memória máxima é apenas o limite do buffer pool, isso não inclui outras áreas dos processos do SQL Server que capturam memória. Portanto, é melhor manter a memória máxima mais baixa para que o sistema operacional e outros processos do SQL Server tenham alguma.
Para se aprofundar no desempenho, use Perfmon, DVMs, sua ferramenta de monitoramento (se incluir monitoramento do SQL Server).
Especificando a memória máxima: eu baseio no sistema operacional, mas você também deve considerar o que mais está sendo executado no servidor. Você está executando outros componentes do SQL Server (SSIS, SSAS, SSRS)? Você tem algum agente para fins de monitoramento ou segurança? Um exemplo, o valor base para mim com o Windows Server 2012 R2 é deixar o sistema operacional com 6 GB de RAM e todo o resto vai para o SQL Server.
Consulte Monitorar o uso de memória na documentação do produto.
Resposta do Wiki da comunidade gerada a partir dos comentários das perguntas de Shanky e Shawn Melton
Dos 64 GB no servidor, o SQL Server está usando 60 GB e o restante (4 GB) é usado pelo sistema operacional. Isso é claro e simples. Como você não definiu
max server memory
, ele também pode usar 61 GB e também reduzir para 58 GB. Isso é gerenciado automaticamente. Não vejo nenhum problema aqui.Consulte SQL Server 2008: quanta memória RAM o SQL Server deve usar em um servidor de 8 GB de RAM? No momento em que você adicionar mais RAM e definir
max server memory
, o SQL Server tentará utilizá-lo e provavelmente o fará. O SQL Server está com fome de memória, ele usará memória e armazenará em cache os objetos.A memória sempre será usada se você der acesso ao SQL Server a ela, mas isso não vai resolver problemas gerais de desempenho se o código for o problema (por que ele quer usar tanto?) Jogar hardware em um problema é apenas uma abordagem band-aid para consertar as coisas. Se você tiver 70 GB de dados, o SQL Server, em algum momento, tentará colocar todos os 70 GB na memória quando algo tentar acessá-los.