Usuário com melhor resposta
SQL SERVER com consumo excessivo de memória

Pergunta
-
Boa tarde,
Estou com um problema em um servidor que apresenta consumo alto de memória RAM e nunca diminui.Neste servidor, esta rodando um serviço windows (aplicação C#) que processa uma massa de 2000 registros dentro de um intervalo de 1 hora esta com consumo crescente de memória (processo do SQL) a medida que executa as operações no banco de dados e nunca diminui.
Não há outras aplicações em execução.
Em determinada ocasião, só o processo do SQL chegou a 6GB de memória e desligou o servidor.
Neste servidor esta instalado Windows Server 2008 R2, a versão do SQL Server é 2012, e possúi 8GB de memória.
Já verifiquei se a aplicação estava mantendo conexões abertas com o banco mas não esta.Também procurei nos LOGS do SQL Server se havia registros em DEADLOCK, também não há.
Li alguns artigos que é possível limitar o consumo máximo de memória nas configurações do servidor (propriedades, opção "memória"). Mas não sei se esta é uma alternativa correta.
Gostaria de saber o que poderia estar ocasionando esse consumo excessivo de memória e o que pode ser feito para diminui-lo.
Otavio
Respostas
-
Caro Otavio,
Por favor, retorna pra gente poder continuar te ajudando.
O correto é você avaliar quanto de memória sua aplicação consome, somar com o consumo do SO e subtrair do total. O resultado é o que você terá disponível para o SQL Server. Por exemplo, se o seu servidor tem 8GB de RAM, sua aplicação consome 1GB, o SO consome 2GB, sobraria 5GB para o SQL Server.
Através do sp_configure você altera a opção "max server memory" para 4,5GB porque o processo do SQL Server consome um pouco mais do configurado. Se a performance ficar aceitável e não houver nenhum outro processo que consuma memória repentinamente (como um antivírus ou outra aplicação), seu problema está resolvido.
O SQL Server por padrão não devolve memória ao Sistema Operacional a não ser que haja uma sinalização de falta de memória RAM feita pelo Windows. Quando isso acontecer, o SQL vai devolvendo memória RAM para o SO até o configurado na opção "min server memory". Portanto, se o seu max estiver igual ao min, o SQL não devolverá nada e poderá ocasionar um unexpected shutdown.
Se o Lock Pages in Memory estiver habilitado, o risco de unexpected shutdown aumenta. Como estão suas configurações de memória virtual?
Abs!
Luiz Mercante | MCITP SQL 2008 | MCTS SQL 2008 | MTA Database Fundamentals | MCTS Windows Apps | MCTS Windows Network | MCP 2003 | sqldicas@outlook.com | http://sqldicas.com.br --> Se a resposta foi útil de alguma forma, classifique como resposta ou vote como útil.
- Marcado como Resposta Junior Galvão - MVPMVP, Moderator domingo, 22 de novembro de 2015 00:25
Todas as Respostas
-
Só uma dúvida, não sei como limitar o servidor (RAM), mas, você roda alguns SP_WHO e SP_WHO2 no servidor quando há processos de persistência ?
Os pools da aplicação estão bem trabalhados para não sobrecarregar o banco ?
Digo isso porque já fiz várias cacas que sobrecarregavam o banco em aplicações, então quem sabe né...
Só uma observação mesmo, boa sorte amigo !
-
Olá Otavio,
Sete nas configurações do SQL um limite máximo de 80% de sua memória RAM, e ative o locked pages in memory em seu servidor. Essas ações vão evitar o consumo de ram que poderá causar lentidão geral. Infelizmente se não ocorrer otimização de seu banco um aumento de mémoria será a unica opção.
-
Olá Otávio, o comportamento do SQL Server está normal, pois ele sempre irá pegar toda memória que ficar disponível para ele. Provavelmente seu servidor não possui limitação de memória em sua parametrização.
O Ideal para você determinar quanto deve-se deixar de memória para seu servidor é monitoramento o quanto o mesmo realmente precisa para o SQL Server, no entanto existem alguns outros fatores que lhe pergunto.
Este servidor é dedicado ao SQL Server?
Existe alguma outra aplicação pesada para o mesmo?
Podemos fazer uma conta genérica para estabelecer esse parametro de memória, no entanto também vale atentar-se a versão que está utilizando do SQL Server, versões até 2008 não contemplam toda estrutura de memória dentro deste parâmetro, sendo assim, precisa-se existir uma preocupação a mais com essa parte da memória.
Se precisar de ajuda me envie e-mail que eu lhe passo meu skype.
Abraços.
Caio Amante
-
Otávio,
Como destacado pelo Caio, o comportamento do SQL Server esta correto e normal, além disso, é justamente desta forma que ele trabalha, fazendo alocação de memória de acordo com as necessidades e recursos.
Recentemente passei por algo similar em um cliente onde o mesmo tinha uma aplicação desenvolvido em Java, que trabalhava com o conceito de transação implícita, onde a aplicação criava uma única transação durante o seu processamento, com isso, o consumo de memória era liberado somente quando a aplicação fazia a confirmação ou encerramento da transação.
Provavelmente esta aplicação esta criando um cache alocando tudo em memória o que esta fazendo com que seu SQL Server aumente de forma considerável a alocação no Buffer Pool.
Uma pergunta, você esta identificando este alto consumo de que forma? Esta utilizando o Task Manager do Windows? A forma mais indicado seria utilizar a ferramenta Perfomon(Performance) existente no Windows utilizando alguns contadores específicos de análise de memória.
Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Caro Otavio,
Por favor, retorna pra gente poder continuar te ajudando.
O correto é você avaliar quanto de memória sua aplicação consome, somar com o consumo do SO e subtrair do total. O resultado é o que você terá disponível para o SQL Server. Por exemplo, se o seu servidor tem 8GB de RAM, sua aplicação consome 1GB, o SO consome 2GB, sobraria 5GB para o SQL Server.
Através do sp_configure você altera a opção "max server memory" para 4,5GB porque o processo do SQL Server consome um pouco mais do configurado. Se a performance ficar aceitável e não houver nenhum outro processo que consuma memória repentinamente (como um antivírus ou outra aplicação), seu problema está resolvido.
O SQL Server por padrão não devolve memória ao Sistema Operacional a não ser que haja uma sinalização de falta de memória RAM feita pelo Windows. Quando isso acontecer, o SQL vai devolvendo memória RAM para o SO até o configurado na opção "min server memory". Portanto, se o seu max estiver igual ao min, o SQL não devolverá nada e poderá ocasionar um unexpected shutdown.
Se o Lock Pages in Memory estiver habilitado, o risco de unexpected shutdown aumenta. Como estão suas configurações de memória virtual?
Abs!
Luiz Mercante | MCITP SQL 2008 | MCTS SQL 2008 | MTA Database Fundamentals | MCTS Windows Apps | MCTS Windows Network | MCP 2003 | sqldicas@outlook.com | http://sqldicas.com.br --> Se a resposta foi útil de alguma forma, classifique como resposta ou vote como útil.
- Marcado como Resposta Junior Galvão - MVPMVP, Moderator domingo, 22 de novembro de 2015 00:25