Quanta RAM um servidor realmente precisa?

10

Eu tenho alguns servidores implantados em todo o mundo. Eles estão executando o Windows 2003 x64 com o SQL Server 2005 x64 com 6 GB de RAM. As caixas não têm a melhor (ou mesmo aceitável) configuração, porque o cara que as encomendou anos atrás realmente não sabia o que estava fazendo.

As caixas ficam razoavelmente sem memória, acabam usando o arquivo de paginação e tudo fica mais lento. Normalmente, a taxa de confirmação é de 5,8 GB e, quando alguém precisa fazer algo intensivo (por exemplo, gerar um relatório), esse número passa pelo limite máximo.

Eu tenho tentado obter os poderes que solicitam mais memória, mas estou recebendo uma grande oposição (por exemplo, tornar o software mais eficiente, custar demais para todos esses servidores ou provar que a caixa não tem memória suficiente , etc ...).

Existem diretrizes (ou uma fórmula) para quanta RAM uma caixa precisa que eu possa apresentar para não-técnicos, para que possamos finalmente pedir mais memória?

    
por AngryHacker 23.10.2009 / 23:27

7 respostas

9

Não é realmente uma maneira de dizer facilmente, porque depende totalmente do seu uso e do aplicativo. Você está maximizando um servidor de banco de dados ... qual é o tamanho do banco de dados? Quais são as estatísticas da sua transação?

As limitações do mundo real são óbvias em seu cenário. Você está correndo por algum tempo em 6 gigas sem problema, então está trocando e debatendo.Então, 6 gigas não são suficientes.

Se o desempenho é suficiente para impactar os negócios, seus superiores devem estar ouvindo reclamações suficientes de que é prudente aumentar a memória. Descobrir o que seu tempo custa e, em seguida, descobrir quanto custará para "ajustar" o servidor e solucionar o problema, quando a memória adicionada ao servidor pode muito bem resolver o problema pelo custo da memória e menos de meia hora tempo de inatividade.

Você não saberá a quantidade exata de memória necessária até que realmente implante em seu uso real e trabalhe a partir daí.

Dito isso, você pode querer verificar se o seu aplicativo é realmente o gargalo. Execute o monitor de desempenho do Windows para ver suas estatísticas de E / S de disco e taxa de transferência de rede. Veja também qual é o seu nível de fragmentação ( O Google é um bom amigo aqui . Você poderia tentar a auditoria do código para problemas óbvios também, onde uma consulta está sendo massivamente ineficiente ( Google novamente ).

Mas, novamente, tudo depende do quanto isso está impactando o negócio. Vale a pena investir mais na afinação, ou é ruim o suficiente lançar o hardware primeiro e depois tentar ajustá-lo?

    
por 23.10.2009 / 23:58
11

Uma maneira fácil de ver se você precisa de mais memória RAM é mapear o contador de desempenho da Esperança de Vida da Página. Esse contador informa quanto tempo o SQL Server acha que os dados serão mantidos no buffer pool antes de precisar liberar espaço para outros dados. Você quer esse número o mais alto possível. Com 6 Gigs de RAM instalados (você deve ter o SQL configurado para o máximo de provavelmente 4 GB), você provavelmente só manterá os dados na memória por alguns minutos no máximo, quando alguém executar um relatório grande, você verá esse número de tanque até alguns segundos. Quanto mais RAM você tiver, mais dados poderão ser mantidos na memória e menos leitura dos discos precisará ser feita.

Por exemplo, os sistemas com os quais estou trabalhando atualmente têm 256 GB de RAM e mantemos os dados na memória por aproximadamente 12000 segundos ou mais.

Por favor, não peça um número alvo para acertar, você só quer o número mais alto possível. Sem saber muito mais sobre seus sistemas, não posso dar um bom número para fotografar.

    
por 26.08.2011 / 19:27
6

Hmmmm. Bem, 6 shows é uma quantidade decente de memória RAM, mesmo para uma grande instalação do MSSQL. Você pode realmente querer olhar e certificar-se de que seu código é realmente eficiente. Uma transação de 6 gigs é um pouco incomum ... Eu trabalhei em sistemas de folha de pagamento em todo o estado que não atingiram um desempenho no processamento final do ano 1099 ... E ter um funcionando frequentemente ? Eu não sei. Com que tipo de dados você está trabalhando?

Dito isso, você pode colocar a maior quantidade de RAM que quiser em uma caixa de 64 bits, e a memória RAM é muito barata, então pode colocar o máximo que puder ... Não pode ter muito muita RAM em um servidor de banco de dados.

Editar: está descontroladamente desatualizado agora. Eu tenho caixas MSSQL com 256 GB de RAM.

    
por 23.10.2009 / 23:37
4

Antes de começar a comprar mais memória (ou qualquer outro componente), recomendo executar uma análise de desempenho no servidor. Você pode fazer isso sozinho usando perfmon ou pode usar ferramentas de terceiros. Você deve analisar o desempenho do sistema operacional e do servidor SQL. IMHO, muitas vezes estamos prontos para lançar hardware em um problema antes de uma análise adequada ter sido feita. Por tudo o que você sabe, pode ser um problema com uma consulta, procedimento armazenado, plano de execução, E / S de disco, utilização da CPU, etc., etc. A pressão da memória pode ser um sintoma de outro gargalo no sistema. / p>     

por 24.10.2009 / 00:08
1

como "Satanicpuppy" disse, não existe muita RAM, mas 6GB deve estar ok, talvez você deva repensar o que seu servidor faz, não acho que você tenha um problema de "hardware" , você deve se concentrar em sua programação SQL ...

    
por 23.10.2009 / 23:54
1

Quando se trata de servidores de banco de dados, não há memória "suficiente". Claro, isso depende do que eles realmente fazem e executam, mas se for um banco de dados constantemente utilizado contendo muitos dados e fazendo consultas complicadas - 6 GB poderiam ser facilmente inadequados.

Eu começaria atualizando um servidor problemático para pelo menos 32 ou 64 GB e verificaria se isso ajuda. Se não, volte para o ajuste do banco de dados, solução de problemas e depuração de aplicativos - todos, a menos que um idiota projetou o banco de dados, custam muito mais do que alguns bastidores de memória de servidor (e mesmo se um idiota projetou a coisa. erros corrigidos com suporte retido podem ser um grande desafio).

Dito isso, como alguém afirmou - poderia ser outra coisa impedindo (além de problemas de design de software), como falta de desempenho de E / S de disco ou rede - contratar um profissional de DBA para passar pelo desempenho básico de SQL monitorar por um dia pode ser útil.

    
por 18.02.2011 / 19:15
0

Você deve procurar construir mais índices. Eu acho que, em geral, a maioria das pessoas sub-indexam seu banco de dados.

Isso ainda é código de ar, ainda não testei completamente, mas você deve ir na direção certa

link

Select ‘create index IX_’ +
 sys.objects.name +
 isnull(replace(‘_’ + equality_columns, ‘,’, ‘_’), ”) +
 isnull(replace(‘_’ + inequality_columns, ‘,’, ‘_’), ”) + ‘ on ‘ +
 sys.objects.name +
 ‘(‘ +
 coalesce(equality_columns + ‘,’ + inequality_columns, equality_columns , inequality_columns ) +
 ‘) ‘ +
 isnull(‘ include (‘ + included_columns + ‘)’, ”)
 as CreateIndexSql,
 (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) AS Score,
 sys.schemas.schema_id,
 sys.schemas.name AS schema_name,
 sys.objects.object_id,
 sys.objects.name AS object_name,
 sys.objects.type,
 partitions.Rows, partitions.SizeMB,
 sys.dm_db_missing_index_details.equality_columns,
 sys.dm_db_missing_index_details.inequality_columns,
 sys.dm_db_missing_index_details.included_columns,
 sys.dm_db_missing_index_group_stats.unique_compiles,
 sys.dm_db_missing_index_group_stats.user_seeks, sys.dm_db_missing_index_group_stats.user_scans,
 sys.dm_db_missing_index_group_stats.avg_total_user_cost, sys.dm_db_missing_index_group_stats.avg_user_impact,
 sys.dm_db_missing_index_group_stats.last_user_seek, sys.dm_db_missing_index_group_stats.last_user_scan,
 sys.dm_db_missing_index_group_stats.system_seeks, sys.dm_db_missing_index_group_stats.system_scans,
 sys.dm_db_missing_index_group_stats.avg_total_system_cost, sys.dm_db_missing_index_group_stats.avg_system_impact,
 sys.dm_db_missing_index_group_stats.last_system_seek, sys.dm_db_missing_index_group_stats.last_system_scan
 FROM
 sys.objects
 JOIN (
 SELECT
 object_id, SUM(CASE WHEN index_id BETWEEN 0 AND 1 THEN row_count ELSE 0 END) AS Rows,
 CONVERT(numeric(19,3), CONVERT(numeric(19,3), SUM(in_row_reserved_page_count+lob_reserved_page_count+row_overflow_reserved_page_count))/CONVERT(numeric(19,3), 128)) AS SizeMB
 FROM sys.dm_db_partition_stats
 WHERE sys.dm_db_partition_stats.index_id BETWEEN 0 AND 1 –0=Heap; 1=Clustered; only 1 per table
 GROUP BY object_id
 ) AS partitions ON sys.objects.object_id=partitions.object_id
 JOIN sys.schemas ON sys.objects.schema_id=sys.schemas.schema_id
 JOIN sys.dm_db_missing_index_details ON sys.objects.object_id=sys.dm_db_missing_index_details.object_id
 JOIN sys.dm_db_missing_index_groups ON sys.dm_db_missing_index_details.index_handle=sys.dm_db_missing_index_groups.index_handle
 JOIN sys.dm_db_missing_index_group_stats ON sys.dm_db_missing_index_groups.index_group_handle=sys.dm_db_missing_index_group_stats.group_handle
 WHERE
 sys.dm_db_missing_index_details.database_id=DB_ID()
 AND (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) > 100
    
por 26.08.2011 / 19:01