O que o Page Life Expectancy diz sobre a instância?


9

Instalei o software de monitoramento em algumas instâncias do SQL Server no ambiente. Estou tentando encontrar gargalos e corrigir alguns problemas de desempenho. Quero descobrir se alguns servidores precisam de mais memória.

Estou interessado em um contador: expectativa de vida da página. Parece diferente em todas as máquinas. Por que isso muda frequentemente em alguns casos e o que isso significa?

Veja os dados da última semana reunidos em algumas máquinas diferentes. O que você pode dizer sobre cada instância?

Instância de produção fortemente usada (1): Instância de produção fortemente utilizada (1)

Instância de produção moderadamente usada (2) Instância de produção moderadamente usada (2)

Instância de teste raramente usada (3)

Instância de teste raramente usada (3)

Instância de produção fortemente utilizada (4) Instância de produção fortemente utilizada (4)

Instância de teste usada com moderação (5) Instância de teste usada com moderação (5)

Armazém de dados muito usado (6) Armazém de dados muito usado (6)

EDIT: Estou adicionando a saída de SELECT @@ VERSION para todos esses servidores:

Instance 1: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Instance 2: Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 
Oct 19 2012 13:38:57 
Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Instance 3: Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29 
    Copyright (c) Microsoft Corporation
 Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Instance 4: Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 
Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Instance 5: Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29 
Copyright (c) Microsoft Corporation
 Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Instance 6: Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
Apr 2 2010 15:48:46 
Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Também executei a seguinte consulta nas máquinas:

SELECT DISTINCT memory_node_id
FROM sys.dm_os_memory_clerks

e retornou 2 ou 3 linhas para cada servidor:

Instance 1: 0; 64; 1
Instance 2: 0; 64
Instance 3: 0; 64
Instance 4: 0; 64
Instance 5: 0; 64
Instance 6: 0; 64; 1

O que isso significa? Esses servidores executam o NUMA?


Instância 2 tem SQL Server 2012 e outros são SQL Server 2008 R2
BuahahaXD

A escala dos gráficos realmente não ajuda. Seria mais interessante ver o quão perto de zero os servidores ocupados ficam durante o dia.
James Z

Eu gostaria de poder obter dados mais detalhados. Usei o Solarwinds Database Performance Monitor e não há como exportar dados para um arquivo. A única maneira de fazer isso é consultar seu banco de dados, mas a estrutura não é normalizada nem fácil de entender.
precisa saber é o seguinte

11
Para ajudar você a entender as quedas repentinas: Quando uma grande varredura de dados não armazenados em cache é executada, muitas páginas estão sendo despejadas para dar espaço às novas páginas. É um algoritmo LRU modificado. Novas páginas descartam as antigas.
usr

As instâncias 2 e 6 usam NUMA, outras não.
precisa saber é o seguinte

Respostas:


8

Retirado do MSDN: - https://msdn.microsoft.com/en-us/library/ms189628.aspx

Expectativa de vida da página - indica o número de segundos que uma página permanecerá no buffer pool sem referências.

O SQL sempre procura por páginas de dados na memória. Se uma página de dados não estiver na memória, o SQL precisará ir para o disco (executar uma operação de E / S física) para recuperar os dados necessários para atender a uma solicitação. Se o seu contador PLE estiver baixo, isso indica que as páginas de dados na memória são substituídas regularmente por novas páginas provenientes de operações físicas de E / S. As operações de E / S físicas são caras, o que significa que o desempenho da sua instância SQL será afetado adversamente. Portanto, você deseja que seu contador PLE seja o mais alto possível.

Ignore os conselhos que você vê online que mencionam 300 como um bom limite para esse contador

Esse limite vem dos dias em que a memória era limitada (pense em sistemas de 32 bits). Agora temos sistemas de 64 bits que podem ter TBs de RAM, portanto este conselho está muito desatualizado.

Primeira coisa, você limitou a memória do SQL? Em caso afirmativo, quanta memória disponível resta? O limite pode ser aumentado?

A segunda coisa que eu procuraria nos seus servidores é: existem trabalhos de manutenção em execução? Verifique se há trabalhos executando reconstruções de índice, atualizando estatísticas ou operações DBCC CHECKDB. Eles realizam uma grande quantidade de leituras e podem ser o motivo do seu revestimento plano PLE,

Em seguida, ao usar o SQL Server 2008 +, você pode configurar uma sessão de evento estendido para capturar consultas que estão realizando uma grande quantidade de leituras. Aqui está o código para fazer isso: -

CREATE EVENT SESSION [QueriesWithHighLogicalReads] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(
   ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack,sqlserver.username)
     WHERE ([logical_reads]>200000))
ADD TARGET package0.event_file(SET filename=N'C:\SQLServer\XEvents\QueriesWithHighLogicalReads.xel')
GO

Isso capturará todas as consultas em seu servidor que executam mais de 200000 leituras lógicas. Não sei quanta memória você tem em cada servidor, portanto, você pode querer ajustar esse número. Depois de criado, você pode iniciar a sessão executando: -

ALTER EVENT SESSION [QueriesWithHighLogicalReads]
ON SERVER
STATE = START;
GO

E, em seguida, consulte a sessão executando: -

WITH CTE_ExecutedSQLStatements AS
(SELECT
[XML Data],
[XML Data].value('(/event[@name=''sql_statement_completed'']/@timestamp)[1]','DATETIME')    AS [Time],
[XML Data].value('(/event/data[@name=''duration'']/value)[1]','int')                        AS [Duration],
[XML Data].value('(/event/data[@name=''cpu_time'']/value)[1]','int')                        AS [CPU],
[XML Data].value('(/event/data[@name=''logical_reads'']/value)[1]','int')                   AS [logical_reads],
[XML Data].value('(/event/data[@name=''physical_reads'']/value)[1]','int')                  AS [physical_reads],
[XML Data].value('(/event/action[@name=''sql_text'']/value)[1]','varchar(max)')             AS [SQL Statement]
FROM
    (SELECT 
    OBJECT_NAME              AS [Event], 
    CONVERT(XML, event_data) AS [XML Data]
FROM 
    sys.fn_xe_file_target_read_file
('C:\SQLServer\XEvents\QueriesWithHighLogicalReads*.xel',NULL,NULL,NULL)) as v)

SELECT
[SQL Statement]     AS [SQL Statement],
SUM(Duration)       AS [Total Duration],
SUM(CPU)            AS [Total CPU],
SUM(Logical_Reads)  AS [Total Logical Reads],
SUM(Physical_Reads) AS [Total Physical Reads]
FROM
CTE_ExecutedSQLStatements
GROUP BY
[SQL Statement]
ORDER BY
[Total Logical Reads] DESC
GO

Tenha cuidado ao executar isso! O tamanho do arquivo pode ser bastante grande; portanto, teste-o primeiro em uma instância de desenvolvimento. Você pode definir o lance máx. tamanho do arquivo, mas não o incluí aqui. Aqui está o link do MSDN para eventos estendidos: - https://msdn.microsoft.com/en-us/library/hh213147.aspx

Monitore esta sessão rotineiramente e, esperançosamente, ela deve atender a todas as consultas que chegam ao seu PLE.

Leitura adicional -

Blog do MSDN no PLE - http://blogs.msdn.com/b/mcsukbi/archive/2013/04/12/sql-server-page-life-expectancy.aspx

Vídeo sobre a configuração de eventos estendidos - https://dbafromthecold.wordpress.com/2014/12/05/video-identifying-large-queries-using-extended-events/ (É do meu próprio blog, desculpe pela autopromoção desavergonhada )


4

A expectativa de vida da página é uma medida de quanto tempo você pode esperar que uma página que acabou de ser lida no disco fique na memória antes de ser empurrada por outra coisa ou ser destruída (ou seja, que a página seja desalocada no disco para que não haja necessidade para manter uma cópia em cache na RAM).

Como uma medida geral, quanto maior for, mais rápido o seu padrão de carga será processado porque as coisas estão sendo mantidas na memória. Se estiver muito baixo, isso pode indicar um problema de desempenho causado por falta de memória.

A leitura baixa nem sempre significa que há um problema: por exemplo, pode ser baixa após uma quantidade excessiva de processos únicos que usaram muitas páginas, para que sejam trazidas e retiradas para dar espaço a mais. Seu gráfico que parece cair no final de cada dia, por exemplo, pode ser causado por tarefas administrativas noturnas (backup, arquivamento de dados, outro processamento noturno).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.