Como obtenho o SQL Server para liberar sua memória?

19

Eu sei que o SQL gosta de RAM, mas a libera quando o Windows pede. Eu sei que é assim que o SQL deve funcionar. Mas eu tenho um administrador do Windows que não está convencido de que o SQL retornará a RAM e, nesse servidor (virtual) específico, o SQL não precisará de muito quando o Analysis Services for concluído, mas não há mais nada nesse servidor que esteja se preocupando em peça muito ao SQL.

Portanto, estou tentando garantir aos administradores do Windows que os problemas com o ambiente virtual não são "porque o SQL está usando muita RAM", mas não consigo convencer o SQL a liberá-lo sem reiniciar o serviço.

Ao processar cubos, o serviço SQL consome 8 GB de RAM, mas como não há pressão, ele não libera muito disso durante um dia normal. Os caras do Windows gritam, e seria muito melhor ter o SQL liberando isso.

Não quero usar a configuração de memória máxima, porque realmente quero que o SQL use tanta RAM ao processar. Eu só quero voltar novamente depois.

É potencialmente uma duplicata do SQL Server não liberando memória e Recuperando memória do SQL Server , mas estou me perguntando se há uma resposta diferente. Esperar pela recuperação do Windows, não vai convencer os caras do Windows aqui. Reiniciar o serviço é uma opção, mas eu realmente não sou fã dessa ideia.

Quero saber como obter o Windows para solicitá-lo de volta ...

Rob Farley
fonte
2
O que ... um administrador de sistema está reclamando da RAM sendo usada? Fico uma merda quando a RAM não está sendo usada, porque se não estiver sendo usada, será desperdiçada ...
Mark Henderson
Também não o recebo, se a máquina não precisar de memória - onde está o problema? É assim que o sistema operacional e seus aplicativos normalmente funcionam ... dado que a carga de trabalho com o serviço SQL ocioso mantém mais memória quando nada mais precisar, pode aumentar o tempo de resposta e / ou o desempenho do próximo trabalho SQL?
Oskar Duveborn
O administrador do Windows sente que o SQL está estressando a máquina porque o processo tem muita memória RAM. Sei que a caixa não está sob estresse do SQL e posso demonstrá-lo reiniciando o serviço SQL, mostrando que consome apenas muita RAM ao obter os dados para o processamento do SSAS. Então, eu quero que o SQL libere a memória para mostrar a quantidade de RAM que o SQL está usando pelo resto do dia. Não se trata de fazê-los fornecer mais RAM, apenas fazê-los parar de culpar o SQL por coisas.
Rob Farley
2
Concordo com o Farseeker, o sysadmin deve estar feliz em que a RAM esteja sendo usada. Se não estiver sendo recuperado, o servidor não precisará dele. Talvez peça ao administrador do sistema que verifique as falhas da página para mostrar que o sistema não está estressado?
Nick Kavadias
2
Se o seu administrador de sistemas não entender o que as falhas de página representam e por que consumir memória, mas nenhuma falha de página real ocorrendo não é um problema, não sei como ajudá-lo. Você não pode consertar estúpido. Uma coisa que você pode fazer, no entanto, é usar sp_configure para configurar a memória máxima para baixo quando você não estiver usando o sistema e configurá-la novamente quando você precisar. Isso parece bem bobo, no entanto. sp_configuregeralmente é algo que você deve definir uma vez e deixar em paz.
Bacon Bits

Respostas:

12

Acredito que sua única opção é reiniciar o serviço SQL ou executar um aplicativo que consome muita memória para forçar o SQL a liberá-lo.

Gosto da sugestão de @Nick Kavadias: monitore o contador de desempenho Memória: falhas de página / segundo para mostrar que o SQL não colocou a memória do sistema operacional sob pressão.

Mitch Wheat
fonte
2
Obrigado Mitch ... Deixe-me encontrar esse arquivo de texto de 10 GB para o Bloco de Notas.
Rob Farley
lol !, na verdade isso não é uma má ideia!
Mitch Wheat
talvez usar um arquivo de 2 GB ...
Mitch Wheat
5

Uma maneira de mostrar a eles que isso é feito é ter o SQL Server consumindo toda a memória. Em seguida, copie um arquivo enorme pela rede (arquivos grandes de backup do SQL funcionam muito bem para isso). Isso fará com que o cache do sistema seja preenchido e o Windows começará a solicitar sua memória ao SQL. O SQL começará a retornar a memória de volta ao sistema operacional até atingir sua configuração mínima de memória.

(Desculpe, não recebi a pergunta inteira via Twitter, aparentemente eram necessários mais de 140 caracteres.)

Mrdenny
fonte
1
Estou esperando por algum processo que eu possa usar que solicite ao SQL a memória de volta (depois que os buffers forem limpos e descartados), mas sem precisar aleijar a caixa para fazer isso.
Rob Farley
Não acho que exista uma maneira de forçar o gerenciador de memória do Windows a solicitar a memória de volta, sem forçar o problema por outros meios. Provavelmente, você pode escrever algo que atinja diretamente a API do win32, mas, até onde sei, a única maneira de acionar o Windows para solicitar memória de volta é fazer com que ele precise de mais memória para outro processo. Verifique com Bob ou Paul, eles podem ter mais informações.
achou
3
O driver de balão da VMware faz exatamente isso - solicita ao Windows mais e mais memória para que o SQL Server (ou qualquer outro aplicativo) renuncie à memória.
Brent Ozar
Sim - eu esperava que não tivesse que fazer algo assim.
Rob Farley
@BrentOzar, o driver ballon da VMware recupera apenas a memória do cache do sistema , não a memória real do processo; Ele foi desenvolvido como uma maneira de dizer ao sistema operacional "não gaste toda a memória disponível para coisas triviais", para não reduzi-lo.
Massimo
2

Você menciona 'cubos', para que não fique claro se você está falando sobre o mecanismo AS ou o mecanismo relacional. O mecanismo relacional pode liberar memória sob demanda:

DBCC FREESYSTEMCACHE('<cache name>');

Onde 'cache name' é obtido de sys.dm_os_memory_clerks . As especificações do DBCC FREESYSTEMCACHE mencionam apenas conjuntos de governadores, mas muitos mais caches podem ser despejados.

Mas se toda a memória for usada pelo buffer pool, despejar todo o buffer pool resultará em uma enorme degradação do desempenho e em uma enorme carga de E / S. Melhor deixar o SQL lidar com isso sozinho.

Remus Rusanu
fonte
1
Oi Remus, o cache do buffer relacional é grande após o processamento de um cubo. Depois disso, eu realmente quero os caches limpos, descartados e a memória retornada ao Windows. DBCC DROPCLEANBUFFERS e FREESYSTEMCACHE esvaziam o cache, mas não retornam a memória para o Windows, portanto, não é exatamente o que eu quero.
Rob Farley
2
Em teoria, você poderia fingir pressão de memória (por exemplo, você poderia trampolim QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ), mas eu realmente não iria lá. Se o SQL não libera memória confirmada, é porque o sistema operacional não precisa dela. O sistema operacional não precisa de memória porque o SQL é o único aplicativo no host ( stackoverflow.com/questions/1401834/… ), certo? Se você executou algum outro aplicativo ao longo do SQL, já o esperava.
Remus Rusanu
2

Com os mecanismos AS e DS, você pode colocar um limite na memória para que eles fiquem abaixo de um limite seguro; isso é recomendado em máquinas de 64 bits com muita RAM e / ou várias instâncias do SQL. Pelo menos para o mecanismo de banco de dados, se você alterar o limite de memória para menos do que o uso atual, reduzirá a quantidade de memória instantânea sem ter que reiniciar o serviço, embora não tenha certeza sobre o SSAS.

Jason Cumberland
fonte
Ter a tampa está ok, mas acho que vou querer diminuir a memória máxima após o processamento e empurrá-la de volta, quando eu preferir limpar os buffers, soltá-los e pedir ao Windows alguma pressão de memória.
Rob Farley
1

O mais fácil que encontrei é acessar as propriedades da memória do servidor, inserir um valor menor, aplicar, aguardar alguns minutos e ajustar a configuração novamente.

Também descobrimos que o uso otimizado da memória dos servidores sql pode realmente melhorar o desempenho do servidor, pois oferece mais RAM para armazenamento em cache no Windows, etc.

Nick van Esch
fonte