Pergunta

Eu tenho uma produção de "Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)", que está mostrando estranho buffer e expectativa de vida da página (PLE) sintomas.

Estou executando esta a cada minuto no meu servidor (para controlar esse problema):

SELECT @ple = CAST([cntr_value] AS VARCHAR(20))
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'

SELECT @usedBufferPages = CAST(COUNT(*) /128 AS VARCHAR(20)) 
FROM sys.dm_os_buffer_descriptors

DECLARE @StartDate VARCHAR(8) = Convert(VARCHAR(8), GETDATE(), 14)
RAISERROR ('%s. PLE at %s and Used Buffers at %s at %s ', 0, 
            1,@runCountString ,@ple, @usedBufferPages, @StartDate) WITH NOWAIT  

Este é um exemplo de saída:

16. PLE at 858 and Used Buffers at 7290 at 09:51:42 
17. PLE at 918 and Used Buffers at 7342 at 09:52:42 
18. PLE at 978 and Used Buffers at 7408 at 09:53:43 
19. PLE at 1039 and Used Buffers at 7547 at 09:54:43 
20. PLE at 1100 and Used Buffers at 7697 at 09:55:44 
21. PLE at 1160 and Used Buffers at 7901 at 09:56:45 
22. PLE at 1221 and Used Buffers at 7961 at 09:57:46 
23. PLE at 1282 and Used Buffers at 8012 at 09:58:46 
24. PLE at 11 and Used Buffers at 313 at 09:59:46 
25. PLE at 31 and Used Buffers at 966 at 10:00:46 
26. PLE at 90 and Used Buffers at 1580 at 10:01:47 
27. PLE at 151 and Used Buffers at 3072 at 10:02:47 
28. PLE at 211 and Used Buffers at 3152 at 10:03:47 
29. PLE at 271 and Used Buffers at 3729 at 10:04:47  

No item #24 SQL Server relata o PLE indo de 1,282 11.O SQL Server também relata que os buffers de ir de 8,012 313.

Primeiro eu olhei para os pobres de execução de consultas, e eu encontrei um corrigidos alguns (não teve nenhum efeito sobre o problema).Mas, eu não sou encontrar qualquer problema consultas que se correlacionam às vezes em que eu tenho de PLE/Buffer de problemas.Também, se fosse um pobre de executar a consulta, então eu acho que os Buffers seria cheio de consulta de dados, não vazio//em falta com erro.

Seguinte, eu pensei que a Máquina Virtual estava ficando sua memória restrito quando isso aconteceu.Mas eu pedi o meu Sistema Administrador e ele me garante que a memória não é dinâmico ou compartilhado de forma alguma.(O que é atribuído, ele fica, o tempo todo.) Também, eu executar esse script a cada 10 minutos, e quando o PLE relatórios de menos de 50:

  SELECT * FROM sys.dm_os_sys_memory

E ele relata o mesmo valor quando o PLE/Buffers são altas e quando eles são baixos.Para completar, aqui está um exemplo dos valores antes e depois #24 acima:

total_physical_memory_kb    available_physical_memory_kb    total_page_file_kb  available_page_file_kb  system_cache_kb kernel_paged_pool_kb    kernel_nonpaged_pool_kb   system_high_memory_signal_state   system_low_memory_signal_state   system_memory_state_desc
20970996                    4758672                         24378868            7929404                 4844160         686076                  182752                    1                                 0                                Available physical memory is high
20970996                    4743468                         24378868            7892632                 4845000         686580                  182688                    1                                 0                                Available physical memory is high

Tenho verificado que o Sistema de Saúde de Sessão e ele mostra nada relacionado.(Tudo o que tem são a representação falures, e seus tempos não se correlacionam com os tempos o PLE/Buffers de mostrar problemas.

Eu segui quantas vezes isso ocorre, eu não posso ver um padrão ou ligar para quaisquer trabalhos ou atividades programadas.

Aqui está um gráfico que mostra PLE e Buffers de mais de 21 horas:

PLE and Buffers Over 21 Hours

Então, eu estou perplexo.Eu acho que o cerne da questão é que os buffers não o PLE.(Eu acho que PLE é a obtenção de um relatório falso de baixo, porque todos os buffers são, de alguma forma, ausente.)

Mas eu não posso pensar de qualquer maneira que isso pudesse acontecer.Ou o que fazer.

Eu gostaria de conselhos sobre coisas adicionais para verificar ou sugestões do que poderia ser.

Atualizações a partir de perguntas nos comentários:

Assim, como a quantidade de memória é o servidor de dados? O VM tem 20 GB de memória.
O que é a memória máxima do servidor?

name                    value   value_in_use  description
max server memory (MB)  13000   13000         Maximum size of server memory (MB)
min server memory (MB)  0       16            Minimum size of server memory (MB)

NOTA:Eu tenho feito um pouco de leitura sobre isso agora, e parece que estas definições são de errado para meu servidor.

Quão grande é o banco de dados? Existem duas bases de dados transacionais em execução neste servidor (estou no processo de obtenção de servidores para isolá-los.) Suas dimensões são de 383 GB e 378 GB.

Quais outros aplicativos e serviços estão em execução no servidor? Este servidor hospeda os dados para a aplicação.Não há outras coisas a bater.(Eu tenho um replicados Operacional Armazenamento de Dados para relatórios e tal.

O que é a tecnologia VM VM Ware.
É este VM em execução em um host que apenas os hosts de máquinas virtuais com similares de alocação de recursos? Temos muitas VMs em nossa empresa.Todos de tamanho variável.Este é um dos maiores embora.

Você pode confirmar que o seu Sistema de Administração está dizendo a você sobre a alocação de memória sem ter que acreditar nele? Eu não posso.Eu não tenho acesso a essas ferramentas.

(Na minha experiência, os Administradores de Sistema vai dizer um monte de coisas para passar a bola e a culpa do app ou qualquer outra pessoa, se isso significa que eles não tem que fazer nada.) Eu posso entender completamente esse sentimento.

Esse padrão certamente parece grave de pressão de memória Estou de acordo.Eu estava esperando encontrar algo para provar que o SQL está sentindo a pressão de memória.Para que eu possa enviá-lo de volta para os Administradores do Sistema para mais investigação.

Tempo De Espera Estatísticas

WaitType               Wait_S      Resource_S  Signal_S  WaitCount  Percentage   AvgWait_S  AvgRes_S  AvgSig_S 
---------------------- ----------- ----------- --------- ---------- ------------ ---------- --------- ---------
PAGEIOLATCH_SH         16250.10    16219.14    30.96     2171649    29.59        0.0075     0.0075    0.0000   
CXPACKET               14214.03    13238.56    975.47    1187935    25.88        0.0120     0.0111    0.0008   
PAGEIOLATCH_EX         6814.59     6806.21     8.38      638725     12.41        0.0107     0.0107    0.0000   
WRITELOG               5157.42     4873.44     283.98    3588476    9.39         0.0014     0.0014    0.0001   
BACKUPIO               2569.51     2538.12     31.39     1704119    4.68         0.0015     0.0015    0.0000   
LCK_M_IX               2477.15     2477.10     0.05      113        4.51         21.9217    21.9213   0.0004   
ASYNC_IO_COMPLETION    2079.99     2079.66     0.33      836        3.79         2.4880     2.4876    0.0004   
BACKUPBUFFER           1807.75     1759.11     48.64     380189     3.29         0.0048     0.0046    0.0001   
IO_COMPLETION          986.23      985.84      0.39      116112     1.80         0.0085     0.0085    0.0000   
Foi útil?

Solução

Como discutido no Isso SE thread e confirmada pelo OP.

O problema é devido ao bug no SQl Server 2012.Esse bug foi corrigido no O SQL Server 2012 SP1 CU4.Ou para ser mais seguro, disse eu recomendo que você aplicar 2012 de SQL Server SP2 em vez de ir para CU4.

Como por Microsoft correção de Bug detalhes

Você pode enfrentar desempenho lento no SQL Server 2012.Quando você verificar De Desempenho do SQL Server Monitor de ferramentas, você verá o seguinte:

•Um rápido declínio no SQLServer:Gerenciador de Buffer\expectativa de vida da Página valores de contador de desempenho.Quando esse problema ocorre, o contador é perto de 0.

Outras dicas

O conjunto de memória intermédia é apenas 13 GB e seus bancos de dados são 383 GB e 378 GB que você tem classificadas como sendo de OLTP pequenas transações executadas com muita freqüência.

A situação acima, se eu tenho que imaginar é como abaixo :

enter image description here (fonte :Google Fotos)

Você tem que entender como o SQL Server armazena informações :

O SQL Server armazena informações na memória em uma estrutura chamada de memória cache. As informações em cache podem ser dados, as entradas de índice, compilado procedimento de planos e uma variedade de outros tipos de informações sobre o SQL Server. Para evitar a re-criando as informações, ele é mantido no cache de memória, o máximo de tempo possível e é normalmente removido do cache quando ele é velho demais para ser útil, ou quando o espaço de memória é necessária para novas informações.O processo que remove uma informação antiga é chamada de memória de varredura. A memória de varredura é uma freqüente de atividade, mas não é contínua.

Você, com certeza, com memória de fome devido à enorme quantidade de tamanho do banco de dados e sua inadequada de pool de buffer.Consulte - Como determinar ideal de memória, por exemplo?

Recolher aguarde estatísticas e verificar problemas de desempenho que surge a partir de desperdício de memória de pool de buffer

Recomendação:

Adicionar mais memória para o servidor de instância e separar as duas bases de dados em diferentes máquinas virtuais com a quantidade de memória adequada.

Há muito pouco para depurar aqui - você precisa adicionar memória, logicamente dividir o banco de dados através de múltiplas VMs, ou entender que o embaralhamento você tem a ver com memória limitada irá levar a problemas de desempenho e voláteis PLE.Tentando encaixar 800 GB de dados em 13 GB de memória é como tentar guardar na mochila.

Olhar mais de perto a consulta a ser executada.O uso de memória sozinho em bases de dados é normalmente muito grosso, uma métrica para melhorar as coisas.Supondo que você não pode afectar as consultas (caixa preta de aplicação), é ainda vale a pena entender o que está afetando o uso de memória.Por exemplo, um processo em lote pode ir e usar todo o espaço de buffer em um único golpe, consultando todos os dados em uma enorme mesa.

Em especial, para qualquer falta de índices que podem causar tabela completa análises - como eles podem efetivamente limpar a cache no servidor.

O SQL Server tem um excelente conjunto de analisador de ferramentas que podem monitorizar em tempo real, e eu suspeito que você vai ver algo ficar fora como um polegar dorido uma vez que você entrar nela.

Não é que eu estou sugerindo alterar o esquema de banco de dados, mas uma coisa é olhar para fora é excessivamente grande varchar campos - eles podem realmente chupar até um espaço de cache em um grande banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a dba.stackexchange
scroll top