Configuração de memória máxima e mínima do SQL Server

8

Quais são as configurações corretas para memória mínima e memória máxima nesse caso de uso?

O servidor possui 8 GB de RAM, processadores Intel Xeon duplos, executando o Windows Server 2008 R2 / Sql Server 2008 Standard Edition. Está executando vários bancos de dados com tamanhos entre 30 GB e 5 GB.

Originalmente, o uso da memória foi definido com as configurações padrão (min = 0 máx = 2.147.483.647). Nessas configurações, a maioria do uso da memória foi ocupada pelo sqlservr.exe e o servidor precisaria ser reiniciado a cada dia ou dois. Ele funcionaria normalmente no início, mas dentro de um dia o tempo limite começaria em operações simples, como procurar um registro usando a chave primária.

Alterei min = 4.096 e max = 6.144. Isso resulta em apenas 1,4 GB de uso de memória. No entanto, agora todos os quatro cpus estão executando com 50-60% de uso da CPU constantemente. As tarefas demoram aproximadamente 1/3 a mais para serem executadas, embora o servidor seja muito mais estável.

sa555
fonte
Compre mais RAM e deixe o máximo no padrão.
Remus Rusanu 29/07
4
@RemusRusanu Suponho que você quis dizer min por padrão!
Kin Shah
Temos casos de uso muito parecidos e problemas semelhantes (sistema operacional sem mem devido ao SQL pegar tudo) quando as pessoas esquecem as práticas. Nossa prática é usar 0 como min e metade disponível como max.
Paul
@kin não, quero dizer max . I deve ser dito deixar tanto min e max a valores padrão, mas eu nunca entendi por que ninguém nunca mudar o min de qualquer maneira ...
Remus Rusanu
11
@RemusRusanu Presumi que fosse um erro de digitação, assim como a quantidade de conhecimento interno que você tem + suas excelentes respostas. Embora eu discorde de deixar a memória Max como padrão.
Kin Shah

Respostas:

10

Olhando para a disponibilidade de RAM deste servidor em particular e você está executando vários bancos de dados que variam de 30 GB a 5 GB , você definitivamente precisa de mais RAM nesse servidor.

Você não mencionou que esta é uma instância autônoma ou que este servidor está tendo mais de uma instância do servidor sql em execução.

Suas configurações de memória MAX parecem boas para um servidor com 8 GB de RAM. Veja estas configurações de práticas recomendadas da Glenn Berry .

Eu recomendo que você faça uma linha de base do seu ambiente usando os contadores PERFMON abaixo para obter um bom valor da sua configuração de memória:

  • SQL Server: Gerenciador de buffer \ Expectativa de vida útil da página
  • SQL Server: Buffer Manager \ Leituras de página / s
  • Disco Físico \ Leituras de Disco / s
  • Memória \ Mbytes Disponíveis
  • SQL Server: Gerenciador de memória - memória total do servidor
  • SQL Server: Gerenciador de memória - memória do servidor de destino

Memória total do servidor: quantidade de memória atualmente alocada para o buffer pool e não a quantidade total de memória para o SQL Server

Memória do Servidor de Destino: Tamanho ideal do buffer pool correspondente à memória máxima da instância.

Nota: Se a memória total do servidor> memória do servidor de destino, sugere pressão da memória.

O script abaixo o ajudará a encontrar notificações de Memória BAIXA ou ALTA na sys.dm_os_ring_buffers- sessão de integridade do sistema:

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

Algumas boas referências:

Kin Shah
fonte
2
Você tem a comparação total e de destino da maneira errada, mas, de qualquer forma, existem maneiras melhores de determinar se o servidor está sob pressão de memória externa.
Paul White 9
@paulwhite, você pode esclarecer um pouco mais para melhorar minha resposta? Obrigado por olhar.
quer
É uma instância autônoma
sa555 30/07/2013