Para um dos meus servidores com a configuração abaixo, estou continuamente recebendo alertas de baixo PLE, que varia entre 20-400 e uma média de 90-100 em um dia:
Servidor: SQL server 2008R2
Bancos de dados: sistema e 2 bancos de dados de usuário com tamanho máximo de banco de dados de 54 GB
RAM: 16GB
Memória máxima do sistema do servidor: 12,24 GB
Assim que recebi uma dica sobre a pressão da memória, usei o RAMMAP para encontrar o uso da memória e encontrei um processo privado usando 13,8 GB, indicando mais uma dúvida sobre a menor pressão da memória:
Analisei e descobri que um dos DB A do usuário estava usando 8 GB de RAM de acordo com o blog de Paul Randal: Além disso, analisei por um período de tempo e vi o tempdb usando uma média de 3-4 GB de RAM
Então, com uma investigação mais aprofundada, descobri que naquele banco de dados A havia uma tabela com um índice clusterizado consumindo em média 6-6,5 GB de memória. (A fragmentação não é um problema, pois foi verificada)
Agora, a partir daqui, não tenho certeza de como proceder? devo ir e criar os índices ausentes ou posso descartar os não utilizados? ou há algo mais que preciso investigar antes de tirar qualquer conclusão.
Por favor sugira!
Em primeiro lugar, o SQL Server in picture é
SQL Server 2008 R2 RTM
que não é suportado pela Microsoft de forma alguma, aplique o SQL Server 2008 R2 SP3 para pelo menos obter suporte estendidoEu não acho que haja nenhum problema por causa disso, isso é totalmente normal olhando para isso você não pode tirar nenhuma conclusão.
Eu acho que esta tabela é a maior tabela de banco de dados que está consumindo a maior parte do buffer pool. Não posso dizer antecipadamente por que a tabela está mantendo tanta memória novamente
you should first apply SP3 to rule out any possibility of leaks and then move with troubleshooting
.Para um sistema com 12 G RAM, o PLE deve estar em torno de 900. Mas como você diz que está sempre em torno de 300-400, o que me faz pensar que o SQL Server tem que trabalhar duro e mover páginas frequentemente da memória para o disco devido à pressão da memória. Para confirmar a pressão de memória, você precisa confiar em outros contadores, não apenas no PLE, você pode abrir o perfmon e adicionar os seguintes contadores. Seria melhor criar um conjunto de coletores de dados para monitorar contadores de desempenho
SQLServer:memory Manager--Target Server Memory: Esta é a quantidade de memória que o SQL Server está tentando adquirir.
SQLServer:memory Manager--Total Server memory Esta é a memória atual que o SQL Server adquiriu.
(Idealmente, o valor alvo deve ser menor ou igual ao Total)
Leituras de página/s – Número de leituras de páginas físicas do banco de dados que são emitidas por segundo. Essa estatística exibe o número total de leituras de páginas físicas em todos os bancos de dados. Como a E/S física é cara, você pode minimizar o custo usando um cache de dados maior, índices inteligentes e consultas mais eficientes ou alterando o design do banco de dados
Páginas Livres – Número total de páginas em todas as listas livres (as listas livres rastreiam todas as páginas no buffer pool que não estão atualmente alocadas para uma página de dados e, portanto, estão disponíveis para uso imediatamente). Sem dúvida esse valor deve ser alto
Page Life Expectancy – Número de segundos que uma página permanecerá no buffer pool sem referências> se você tiver o sistema NUMA, analise o PLE para cada nó, conforme mencionado neste artigo
Free List Stalls/sec – Número de solicitações por segundo que tiveram que esperar por uma página livre. Idealmente, as paradas devem ser tão zero ou mínimas quanto possível
SQLServer:Gerenciador de Memória--Concessões de Memória Pendentes: Se você vir concessões de memória pendentes no pool de buffers, seu servidor está enfrentando problemas de memória do SQL Server e aumentar a memória seria uma boa ideia. Para concessões de memória, leia este artigo : Se você vir um valor diferente de zero de concessão de memória pendente com PLE baixo e paradas de lista livre alta, você definitivamente tem uma pressão de memória e deve considerar o fornecimento de mais RAM.
Observação: o valor dos contadores acima deve ser coletado por pelo menos 3 a 4 horas e quando a carga no sistema for relativamente alta . Se possível, antes de coletar os valores, limpe o cache do buffer, embora eu não esteja dizendo para você fazer isso, sei que para o sistema Prod não seria possível. Se você produzisse os valores eu poderia analisar para você.
Não tenho ideia sobre a carga de trabalho do sistema e apenas lhe dou a opção de como proceder. Você também deve analisar consultas caras. Procure um que envolva junções e classificações de hash.
Uma consulta incorreta com muitas junções e varreduras em uma tabela grande tem toda a capacidade de trazer contadores como PLE, concessões de memória, paradas de lista gratuita para valor que fazem você acreditar na pressão de memória, sim, mas a causa é uma consulta ruim e índices ausentes e junção incorreta. Você também deve considerar isso.
Editar:
Da saída do coletor de dados de desempenho conforme solicitado para os contadores acima
Abaixo estão alguns pontos notáveis
A memória do servidor de destino e a memória total do servidor permaneceram constantes
there value were equal
durante todo o processo de coleta de dados (das 10h da manhã às 15h da tarde). o que aponta para o fato de que o mecanismo de banco de dados do SQL Server estava satisfeito com seu requisito de memória atualAs concessões de memória pendentes eram
always zero
.Free List stalls/Sec era
always zero
. O que significa que nenhum pedido teve que esperar por páginas gratuitasHouve uma queda considerável no PLE das 14h15 às 15h18 e ao mesmo tempo as páginas lidas/seg estavam muito altas o que me faz acreditar que alguma consulta/processo começou depois das 14h00 o que exigia muitas páginas na memória e portanto, causando turbulência de atividade no buffer pool.
Você precisa descobrir qual consulta está sendo executada depois das 14h e ainda estava em execução, então isso me faz pensar que há process.job começando às 14h. Este processo/trabalho/consulta está tentando ler muitas páginas, o que está fazendo com que o lazywriter libere muitas páginas porque a consulta está solicitando espaço para essas páginas
Pode ser que essa consulta esteja faltando índice, pode ser que esteja criando um plano ruim devido a estatísticas distorcidas, pode ser que a consulta precise ser escrita para obter/ler apenas um subconjunto de dados, não dados inteiros.