locked
Stolen Server Memory e Database Cache Memory RRS feed

  • Pergunta

  • Boa tarde

    Estou com um comportamento em 2 servidores SQL onde o s contadores Database Cache Memory e Stolen Server Memory estão diminuindo e aumentando respectivamente, de maneira linear. Alguém já passou por isso ou saberia indicar um norte para resolver esse tipo de comportamento caso seja um problema?

    Ambos SQL 2012 Enterprise com SP3

    quinta-feira, 10 de novembro de 2016 17:25

Respostas

  • Jose,

    alem do indicador Page Life Expectancy, observe tambem o que acontece com Maximum Workspace Memory.

    Quando o PLE diminuir, veja o que acontece com o 2o. indicador.

    Memory Pressure (pressao de memoria) pode acontecer de duas formas: interna ou externamente.
    - Externa: quando outro servico/processo/aplicacao utiliza mais memoria do que o normal, e acaba roubando memoria que o SQL precisa. Por isso lhe perguntei se os limites de memoria minimo/maximo foram configurados. O limite minimo eh tao importante quanto o maximo.
    - Interna: quando voce roda uma query pesada, ou um processo de reindexacao, uma exclusao de muitos dados, um profiler/trace, etc. Estes processos utilizam memoria e acabam roubando do Buffer (cache) de dados.

    Descobrir se voce esta sofrendo de pressao de memoria interna ou externa pode ser uma tarefa complexa e demorada, mas eu tenho razoes pra acreditar que a sua situacao eh de pressao Interna, entao, investigue melhor estas queries que estao rodando, atraves de um trace (Profiler) por exemplo, e voce podera verificar que as mesmas estao gerando todo o problema.

    Obs.: a terminologia/nomenclatura acima nao esta 100% correta, e ha outros processos envolvidos, mas ajuda a esclarecer os conceitos numa linguagem compreensivel.

    Abcs.

    Pericles Sevegnani

    http://blogsqlserver.blogspot.com.br/
    quarta-feira, 16 de novembro de 2016 01:55

Todas as Respostas

  • Jose,

    bom dia.

    Estas instancias tem memoria suficiente para suportar os databases ?

    Foi definido limite minimo e maximo nas configuracoes da instancia ?

    Os servidores rodam somente o SQL Server ou compartilham servicos e aplicacoes ?

    Voce esta rodando Profiler em alguma destas instancias ?

    Estas instancias estao com Trace Flags ou Auditoria avancada habilitadas ?

    Como esta o PLE destas instancias (Page Life Expectancy) ?

    Abcs.

    Pericles Sevegnani

    http://blogsqlserver.blogspot.com.br/

    segunda-feira, 14 de novembro de 2016 02:18
  • Jose,

    bom dia.

    Estas instancias tem memoria suficiente para suportar os databases ?

    Foi definido limite minimo e maximo nas configuracoes da instancia ?

    Os servidores rodam somente o SQL Server ou compartilham servicos e aplicacoes ?

    Voce esta rodando Profiler em alguma destas instancias ?

    Estas instancias estao com Trace Flags ou Auditoria avancada habilitadas ?

    Como esta o PLE destas instancias (Page Life Expectancy) ?

    Abcs.

    Pericles Sevegnani

    http://blogsqlserver.blogspot.com.br/

    Bom dia

    Respondendo as suas perguntas

    1)As instâncias tem memoria suficiente para suportar os bancos. São sistemas transacionais, existem consultas  sim como em todos os sistemas mas o que impacta são consultas ad-hoc que precisam ser feitas para gerar alguns relatórios.

    2) Sim as configurações foram definidas

    3) Servidores são dedicados

    4) Profiler só é executado em caso de troubleshooting

    5) Trace flags habilitados somente para cpatura de deadlock e tem um do solarwinds usado para capturar as queries executadas mesmo com plano com custo zero (2861).

    6) O PLE está OK, somente caindo quando algumas das queries ad-hoc são executadas.

    Obrigado pela atenção

    segunda-feira, 14 de novembro de 2016 12:07
  • boa tarde Jose,

    o indicador de Stolen Server Memory mostra de maneira clara que algo esta "roubando" sua memoria utilizada para cache dos dados (paginas).

    Essas queries ad-hoc sao minha primeira suspeita.

    Como voce comentou, quando essas queries rodam a PLE cai, eh exatamente esse o comportamento esperado nessa situacao.

    Essas queries estao executando operacoes de Sort ou Hash que estao roubando a memoria que estava reservada para o cache dos dados.

    Verifique a quantidade de registros que essas queries retornam, tente indentificar um possivel novo indice, e ainda, se possivel, separe os dados a serem consultados num processo em batch no servidor, um Job por exemplo, de forma que quando a aplicacao precise das informacoes, elas ja estejam prontas em uma tabela pre-atualizada, ao inves da aplicacao executar as queries diversas vezes.

    Isto deve aumentar seu PLE e estabilizar o indicador de Stolen Pages.

    Abcs.

    Pericles Sevegnani

    http://blogsqlserver.blogspot.com.br/

    segunda-feira, 14 de novembro de 2016 16:31
  • Pericles boa tarde

    Qual seria uma outra opção para investigar? O comportamento do aumento do contador é linear, como se algo aos poucos fosse consumindo a memoria. Essas ad-hocs não são frequentes e também tenho rotinas de limpeza semanais que fazem a PLE cair. Eu tenho uma rotina que calcula o hash de uma query porém ela foi implementada em agosto e tenho dados que desde quando o servidor subiu (Abril 2016), esse contador está subindo.

    Esse processo voce entende como sendo  interno ou externo ao SQL?

    Abs

    segunda-feira, 14 de novembro de 2016 18:35
  • Jose,

    alem do indicador Page Life Expectancy, observe tambem o que acontece com Maximum Workspace Memory.

    Quando o PLE diminuir, veja o que acontece com o 2o. indicador.

    Memory Pressure (pressao de memoria) pode acontecer de duas formas: interna ou externamente.
    - Externa: quando outro servico/processo/aplicacao utiliza mais memoria do que o normal, e acaba roubando memoria que o SQL precisa. Por isso lhe perguntei se os limites de memoria minimo/maximo foram configurados. O limite minimo eh tao importante quanto o maximo.
    - Interna: quando voce roda uma query pesada, ou um processo de reindexacao, uma exclusao de muitos dados, um profiler/trace, etc. Estes processos utilizam memoria e acabam roubando do Buffer (cache) de dados.

    Descobrir se voce esta sofrendo de pressao de memoria interna ou externa pode ser uma tarefa complexa e demorada, mas eu tenho razoes pra acreditar que a sua situacao eh de pressao Interna, entao, investigue melhor estas queries que estao rodando, atraves de um trace (Profiler) por exemplo, e voce podera verificar que as mesmas estao gerando todo o problema.

    Obs.: a terminologia/nomenclatura acima nao esta 100% correta, e ha outros processos envolvidos, mas ajuda a esclarecer os conceitos numa linguagem compreensivel.

    Abcs.

    Pericles Sevegnani

    http://blogsqlserver.blogspot.com.br/
    quarta-feira, 16 de novembro de 2016 01:55
  • Jose,

    alem do indicador Page Life Expectancy, observe tambem o que acontece com Maximum Workspace Memory.

    Quando o PLE diminuir, veja o que acontece com o 2o. indicador.

    Memory Pressure (pressao de memoria) pode acontecer de duas formas: interna ou externamente.
    - Externa: quando outro servico/processo/aplicacao utiliza mais memoria do que o normal, e acaba roubando memoria que o SQL precisa. Por isso lhe perguntei se os limites de memoria minimo/maximo foram configurados. O limite minimo eh tao importante quanto o maximo.
    - Interna: quando voce roda uma query pesada, ou um processo de reindexacao, uma exclusao de muitos dados, um profiler/trace, etc. Estes processos utilizam memoria e acabam roubando do Buffer (cache) de dados.

    Descobrir se voce esta sofrendo de pressao de memoria interna ou externa pode ser uma tarefa complexa e demorada, mas eu tenho razoes pra acreditar que a sua situacao eh de pressao Interna, entao, investigue melhor estas queries que estao rodando, atraves de um trace (Profiler) por exemplo, e voce podera verificar que as mesmas estao gerando todo o problema.

    Obs.: a terminologia/nomenclatura acima nao esta 100% correta, e ha outros processos envolvidos, mas ajuda a esclarecer os conceitos numa linguagem compreensivel.

    Abcs.

    Pericles Sevegnani

    http://blogsqlserver.blogspot.com.br/

    Pericles,

    Será que não temos algumas query que possa justamente esta "roubando" este possível espaço de memória?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 16 de novembro de 2016 13:15
    Moderador
  • Pedro,

    essa foi exatamente meu palpite.

    Acredito que nosso amigo Jose esta sofrendo de pressao interna, ou seja, algumas queries estao utilizando muita memoria e acabam utilizando a memoria de cache.

    Abcs!

    quarta-feira, 16 de novembro de 2016 23:25
  • Eu tenho a relação de queries mais agressoras, também acredito que a pressão seja interna porém um cara no forum stackoverflow deu uma dica que acredito ser algo a ser investigado e coincide muito com o vejo no ambientes. Ele deu uma dica para investigar se conexões OLEDB estão mantendo os objetos em aberto. Fiz uma query aqui em tem várias conexões OLEDB abertas e em sleeping por um período considerável.

    Vou partir para esse tipo de investigação também.

    Obrigado a todos pelas dicas

    sexta-feira, 18 de novembro de 2016 18:06
  • José,

    Pode ser mesmo ainda mais por se tratar de uma conexão através do OLEDB onde por padrão você deve sempre informar a abertura e o encerramento das conexões.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sábado, 19 de novembro de 2016 12:39
    Moderador