Estou tentando encontrar uma maneira sensata de entender se a max server memory (mb)
configuração é apropriada (deve ser mais baixa ou mais alta ou permanecer do jeito que é). Estou ciente de que max server memory (mb)
sempre deve ser baixo o suficiente para deixar espaço para o próprio sistema operacional, etc.
O ambiente que estou vendo possui várias centenas de servidores; Preciso de uma fórmula confiável que eu possa usar para determinar se o tamanho atual do pool de buffers é apropriado, pois a RAM é custada por GB alocado para cada servidor. Todo o ambiente é virtualizado e a RAM "física" alocada para uma VM pode ser facilmente alterada para cima ou para baixo.
Eu tenho uma instância específica do SQL Server que estou vendo agora com um PLE de 1.100.052 segundos, o que equivale a 12,7 dias (a quantidade de tempo em que o servidor esteve ativo). O servidor possui uma configuração de memória máxima do servidor de 2560 MB (2,5 GB), dos quais apenas 1380 MB (1,3 GB) são realmente confirmados.
Eu li vários itens, incluindo um de Jonathan Keheyias ( post ) e outro de Paul Randal ( post ), e vários outros. Jonathan defende que o monitoramento de um PLE abaixo de 300 por 4 GB de buffer pool seja muito baixo. Para a instância do SQL Server acima, 300 * (2.5 / 4) = 187
resulta em um PLE realmente muito baixo, abaixo de 300. Essa instância possui 290 GB de dados do SQL Server (não incluindo arquivos de log) e é usada apenas para testes de integração. Supondo que os últimos 12 dias sejam representativos do uso típico desse servidor, eu diria que a max server memory (mb)
configuração pode ser reduzida.
No outro extremo da escala, tenho outro servidor de teste de integração com um PLE de 294, que possui uma max server memory (mb)
configuração de apenas 1 GB. Este servidor possui apenas 224 MB de dados do SQL Server, sem incluir logs, e está executando alguns bancos de dados do BizFlow. Este servidor pode se beneficiar de uma max server memory (mb)
configuração mais alta .
Estou pensando que um bom ponto de partida para destinos aos quais pode ser atribuída muita memória pode incluir:
SELECT
RamMB = physical_memory_in_bytes / 1048576
, BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576
, BufferPoolCommitTargetMB = bpool_commit_target * 8192E0 / 1048576
, PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),bpool_committed)
/ bpool_commit_target) * 100)
FROM sys.dm_os_sys_info;
Se BufferPoolCommitTargetMB / BufferPoolCommittedMB
for maior que 1, o servidor não está usando o buffer pool inteiro. Se a máquina em questão também tiver um PLE maior que "x", poderá ser um bom candidato para uma diminuição de max server memory (mb)
.
Como o Buffer Manager:Lazy writes/sec
contador de desempenho rastreia o número de vezes que o SQLOS gravou páginas no disco entre os pontos de verificação devido à pressão da memória, isso pode ser outra coisa boa de se olhar.
DECLARE @WaitTime DATETIME;
SET @WaitTime = '00:00:15';
DECLARE @NumSeconds INT;
SET @NumSeconds = DATEDIFF(SECOND, 0, @WaitTime);
DECLARE @LazyWrites1 BIGINT;
DECLARE @LazyWrites2 BIGINT;
SELECT @LazyWrites1 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
WAITFOR DELAY @WaitTime;
SELECT @LazyWrites2 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
SELECT LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds;
O código acima supõe que o servidor esteja sob carga durante os 15 segundos necessários para executar, caso contrário, ele informará 0; o que pode ser falso-negativo enganoso.
Devo também considerar as PAGELATCHIO_*
estatísticas de espera ou algum outro tipo de espera como um indicador da pressão da memória ou da falta dela?
Minha pergunta é: como posso determinar com segurança um valor-alvo "bom" para o PLE e max server memory (mb)
?
fonte
max server memory (mb)
e, como tal, reluto em reduzi-las. No entanto, algumas outras instâncias têm 1.000.000 de PLE e, como tal, são potenciais candidatos bastante óbvios para uma queda na RAM. Claramente, baixando RAM vai causar um aumento na IOPS, e eu não tenho certeza do que o custo do que será.max server memory
cenário é uma coisa de galinha e ovo; quanto menor amax server memory
configuração, menor seria o PLE mínimo "aceitável", para que eu pudesse ficar preso em uma espiral cada vez menor. Tenho certeza de que, como você mencionou, o desempenho do usuário será afetado em algum momento .O atual T-SQL que estou usando para avaliar o PLE vs
max server memory
é:Este código compara o PLE com um PLE mínimo "aceitável" pela quantidade de
max server memory
sistema configurada. Se o PLE for sensivelmente maior que o número aceitável, sugere um máximo de 10% menormax server memory
. Se o PLE for menor que o PLE aceitável, sugere um máximo de 10% a maismax server memory
.Se a quantidade real de buffer pool confirmado for menor que o tamanho do buffer pool de destino, é recomendável diminuir
max server memory
para essa quantidade, além de alguma memória extra para threads, gravações lentas, etc.O código também analisa vários contadores de desempenho, como Lazy Writes / second, Free List Stalls e Batch Requests.
O código não é perfeito, estou compartilhando-o aqui para obter informações e para o benefício de futuros usuários de SO.
fonte