none
SQL SERVER com consumo excessivo de memória RRS feed

  • 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

    sábado, 15 de agosto de 2015 12:52

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.

    quinta-feira, 1 de outubro de 2015 13:56
    Moderador

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 !

    sábado, 15 de agosto de 2015 13:42
  • 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.

    https://support.microsoft.com/en-us/kb/2659143

    Abraços

    sábado, 15 de agosto de 2015 19:36
  • 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

    sábado, 15 de agosto de 2015 20:07
  • 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]

    quarta-feira, 19 de agosto de 2015 15:55
    Moderador
  • 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.

    quinta-feira, 1 de outubro de 2015 13:56
    Moderador