Quanta memória meu SQL precisa?

4

Eu tenho uma VM (servidor de banco de dados SQL) que eu acho que tem mais memória do que precisa, mas não tenho certeza do que posso reduzir porque não entendo exatamente o que "Em uso", "Disponível" , "Committed" e "Cache" significam memória.

O seguinte é uma captura de tela do Gerenciador de Tarefas depois que fiz alguns testes de carga. Vamos supor que a carga não seja muito mais intensa do que isso.

Pareceóbvioparamimque64GBdeRAMédemais.Eugostariadeentenderoquantopossotirarsemreduzirodesempenho.

Issosignificaqueeusóprecisode8GBporqueissoémaisdoqueovalor"Em uso"? Ou preciso incluir o valor "em cache" quando determino quanto é necessário?

    
por kralco626 23.04.2015 / 17:38

2 respostas

5

O SQL Server irá manter a RAM alocada, então, como ele não parece estar acima de 6-7 GB, eu alocaria 8GB para SQL e manteria 2-4 GB extra para o SO nesse caso (SQL sempre faz algumas tarefas fora da memória que aloca para sqlserver.exe .

Seria uma boa idéia colocar esse valor (8 GB) nas configurações mínimas da memória para sua instância do sql server. Dessa forma, quando o SQL precisar da memória, não perderá tempo alocando-a primeiro porque ela "toma" os 8 GB ao iniciar.

Ao brincar com a RAM, você sempre pode verificar a expectativa de vida da página. Isto irá dizer-lhe quanto tempo algo permanece na RAM. Este é um valor em segundos, desde que continue subindo, você é de ouro.

SELECT object_name, counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Buffer Manager%'
AND [counter_name] = 'Page life expectancy'

Contanto que fique acima de 300, você está bem. Valores mais baixos indicariam alguma pressão na memória. Isso pode ocorrer depois de fazer grandes classificações, atualizar / reconstruir índices, ... Não se preocupe se esse valor for baixo depois de reiniciar a instância, nunca poderá ser maior que o tempo em que o SQL está sendo executado.

Um segundo contador interessante é a Taxa de Acertos do Cache do Buffer, isto lhe dirá quantas requisições anteriores (últimos segundos) foram buscadas da memória.

SELECT CAST(A.cntr_value1 AS NUMERIC) /
 CAST(B.cntr_value2 AS NUMERIC)* 100 AS Buffer_Cache_Hit_Ratio_Percentage, A.cntr_value1 As Cache_Hits, B.cntr_value2 AS Cache_Lookups
 FROM ( SELECT cntr_value AS cntr_value1
 FROM sys.dm_os_performance_counters
 WHERE object_name = 'MSSQL$SQL01:Buffer Manager' AND counter_name = 'Buffer cache hit ratio'
 ) AS A,
(SELECT cntr_value AS cntr_value2
FROM sys.dm_os_performance_counters
WHERE object_name = 'MSSQL$SQL01:Buffer Manager' AND counter_name = 'Buffer cache hit ratio base'
) AS B;

Neste exemplo, minha instância do SQL é uma instância nomeada SQL01 , portanto, altere-a para o nome da instância ou altere MSSQL$SQL01:Buffer Manager para MSSQLServer:Buffer Manager se você tiver uma instância padrão.

Quanto maior, melhor. Em uma situação ideal, você teria 100% aqui, isso significa que todo o DB está na memória.

    
por 23.04.2015 / 17:56
0

Grandes definições no link abaixo. Uma estratégia é adivinhar como a primeira resposta e depois ficar de olho nas falhas da página. À medida que suas falhas de página aumentam e à medida que sua memória disponível diminui, você sabe que precisa aumentar a quantidade de memória disponível para a VM. O VMware também deve permitir que você defina se uma VM está ou não limitada à quantidade de memória especificada ou se pode passar por esse limite em um conjunto de recursos compartilhados.

link

    
por 23.04.2015 / 18:33