ajustando o postgresql para grandes quantidades de memória ram

29

Eu tenho dois servidores idênticos (em termos de hardware), ambos são instalações padrão do Windows Server 2008 R2, com o mínimo de software instalado (basicamente meu código e coisas necessárias, como jvm etc).

Em um servidor, estou executando o sql server 2005, no segundo servidor postgresql 9.1. A diferença no desempenho desses dois servidores é impressionante, é tão ruim no postgresql que lamento meu discurso inicial "vamos usar o postgresql em vez de pagar pela licença do servidor sql" para meu chefe. Estamos falando de diferenças de 30 segundos vs 15 minutos para o mesmo comando, e não é apenas este comando, é qualquer consulta ou comando que eu lance nele. Ambos têm praticamente os mesmos dados (os registros foram inseridos em ordem diferente) e os dois bancos de dados têm exatamente a mesma estrutura / índices, etc.

Mas espero que seja apenas uma questão de ajuste de desempenho. O problema é que o sql server está usando praticamente todos os 32 GB de RAM no servidor, enquanto o postgresl não está usando nada, definitivamente menos do que um gig, embora eu ainda não tenha descoberto isso com detalhes.

Como faço para o postgresql usar mais de 20 GB de RAM? Esses servidores foram criados especificamente para esse material de banco de dados, portanto, qualquer ram não usado pelo banco de dados e pelos processos de suporte é desperdiçado na minha opinião.

user85116
fonte
4
Você mudou alguma coisa na sintonia inicial? Passo 1: SET effective_cache_size=18G;(a configuração padrão é extremamente baixo) BTW: assumindo que esta é uma máquina de 64 bits (sem PTE)
1
Você realmente não está nos dando o suficiente para ajudar muito. Além de "Está lento", não sabemos muito sobre o seu conjunto de dados, como você está acessando, que tipos de consultas geralmente estão em execução lenta, o que você já fez para ajustar (e possivelmente ajustar mal) o servidor. Caramba, em uma máquina Linux com muitos núcleos e canais de memória, você pode obter um desempenho ruim antes de instalar o postgresql. Você está vinculado à CPU ou IO? Quais configurações não padrão você já possui? Que tipos de consultas são lentas?
Scott Marlowe
2
O Postgres não "usa ram" do jeito que você fala. Ele se baseia no cache da página do sistema de arquivos do SO para a maior parte de seu armazenamento em cache; portanto, quando você assiste ao uso de ram em um sistema executando o postgres, normalmente vê muitos GBs em uso pelos buffers / cache do SO e processos de backend individuais do postgres usando apenas alguns algumas dezenas de MBs cada.
dbenhur
1
Veja este link: tekadempiere.blogspot.ae/2014/09/… E encontre seus valores de conf baseados em recursos a partir daqui: pgtune.leopard.in.ua
Sajeev
pergunta relacionada, talvez de interesse: stackoverflow.com/questions/47311485/…
mountainclimber

Respostas:

41

Existem muitas constantes ajustáveis, inicializadas via postgres.conf. Os mais importantes são:

  • max_connections: o número de sessões simultâneas
  • work_mem : a quantidade máxima de memória a ser usada para resultados intermediários, como tabelas de hash e para classificação
  • shared_buffers a quantidade de memória dedicada ao espaço do buffer 'fixado'.
  • effective_cache_size a quantidade de memória que se supõe ser usada pelos buffers LRU do sistema operacional.
  • random_page_cost : uma estimativa para o custo relativo das buscas em disco.

max_connectionsnão deve ser definido como mais alto do que o necessário, as conexões custam recursos mesmo quando ociosas; na maioria dos casos, uma conexão passaria mais tempo esperando dentro do que esperando fora. (pelo preço da simultaneidade) Uma boa fórmula geral é "número de eixos + número de processadores + X"

work_memé complicado: pode ser aplicado a todas as subconsultas; portanto, uma consulta com 5 HASHJOINSpode custar 5 * work_mem. E para os piores cenários, você também deve pensar em várias sessões consumindo esse valor (novamente uma razão para se manter max_connectionsbaixo).

shared_buffersé (IMHO) sobrestimado. Normalmente, é aconselhável configurá-lo para cerca de 1/4 ... 1/2 de toda a memória "livre" disponível, mas costumo mantê-la baixa e configurada effective_cache_sizepara toda a memória "livre" disponível.

random_page_costé o custo de uma pesquisa + leitura no disco. É relativo a sequential_disk_cost, que é 1. O padrão (4) para random_page_costé definido muito alto para máquinas modernas e armazenamento em rede, normalmente pode ser reduzido para 2 e 1.x. Para discos SSD, você deve configurá-lo para 1.0, pois a procura é quase gratuita nos SSDs.

wildplasser
fonte
Excelente! Eu nunca vi o significado de effective_cache_size, sempre brincava apenas com shared_buffers. Isso realmente fez uma enorme diferença. Também corro o pgtune e recomenda-se que 20GB de 96 sejam usados ​​para shard_buffers, mas 64GB para effective_cache_size. Obrigado!
1
FWIW, eu passei por essas e outras configurações sugeridas nos documentos do Postgres e fiz uma análise para o nosso servidor .
mlissner
Muito obrigado pela resposta. Posso perguntar qual é o recomendado work_memquando o max_connectionspadrão é 100 e a RAM do servidor é de 32 GB (servidor postgres dedicado)? Eu sabia que precisava ajustar isso sozinho com base em consultas diárias. Estou apenas pensando se você pode me dizer um valor "tamanho único para todas as respostas" (ou um valor de ponto de partida). 50MB é muito grande? Muito obrigado.
sgon00 12/06
Depende da atividade simultânea típica em sua máquina. 100 sessões com 50M (além dos 10..20M) cada uma podem se encaixar. Ou talvez não. Para obter uma impressão, monitore vmstat ou top. Plus: depende da sua consulta (e das outras). Basta olhar para os planos.
wildplasser 12/06
@wildplasser muito obrigado pela resposta rápida. Encontrei um site interessante pgtune.leopard.in.ua . Eu acho que usarei 40MB como ponto de partida de sua sugestão e sintonia com base nisso. Felicidades.
sgon00 12/06
20

Considere usar o pgtune para ajudá-lo a ajustar a configuração do PostgreSQL. Partida PgFoundry:

O pgtune pega o postgresql.conf padrão do wimpy e expande o servidor de banco de dados para ser tão poderoso quanto o hardware no qual está sendo implantado

A configuração padrão do PostgreSQL é muito conservadora e essa ferramenta serve para ajudar nessa situação exata. A documentação é uma leitura leve e o uso da ferramenta é bastante direto.

Lembre-se de que não há necessidade de usar as sugestões exatas do pgtune. Brincando com suas configurações e observando as alterações resultantes no arquivo conf, você entenderá melhor a configuração do PostgreSQL e como ajustá-la manualmente.

Paul Bellora
fonte
8
A última atualização do pgtune foi em 2009, há 5 anos e ainda conta. Gostaria de saber se ainda é válido para a série 9.1-9.2-9.3.
sorin
9
O pgtune já está disponível online
Alfabravo 02/12/2015
3

Se todas as consultas ou comandos estiverem sendo executados lentamente, suspeito que:

  • você se conecta ao banco de dados para todas as consultas executadas;
  • você configurou algum tipo de método de autenticação, que não funciona e interrompe suas consultas até que esse método de autenticação específico atinja o tempo limite.

Você poderia nos dizer quanto tempo leva para executar uma consulta como select version()? Se deve ser instantâneo (0,16 ms na minha estação de trabalho).

Tometzky
fonte
2

Se TODAS as consultas forem muito mais lentas, algo está terrivelmente errado com o servidor ou algo assim. Na minha experiência, cada banco de dados tem algumas coisas em que é melhor que o outro, mas o pgsql em termos de desempenho está facilmente no mesmo domínio que o servidor mssql.

Então, em qual SO você está executando o pgsql? Qual hardware? Quais configurações você já mudou? Qual é o tamanho do seu conjunto de dados? O que é um exemplo de uma consulta ruim e a saída da explicação de análise (execute sua consulta assim:

explicar analisar selecionar ... restante da consulta aqui ...;

Poste a saída em http://explain.depesz.com/ e poste o link aqui.

Scott Marlowe
fonte
1
Sim, cada consulta / comando está sendo executado lentamente, e sim "algo" está terrivelmente errado, portanto, minha pergunta. O problema é que o mssql está fazendo pleno uso da memória RAM disponível no servidor (cache tão pesado), enquanto o psql não está. Agradeço comentários e conselhos, mas você deve ter perdido a maior parte da minha pergunta e da própria linha de assunto ... Eu só quero saber como obter o psql para fazer uso do RAM disponível; No momento,
estou
1
Usar sua RAM NÃO é o problema. O Postgresql depende do sistema operacional para fazer a maior parte do cache. Portanto, não é necessário usar toda a RAM. Mais uma vez, você perdeu a maior parte do meu argumento. Você está nos dando muito pouco para ajudá-lo. Dirijo 5000 clusters de postgresql para a vida. Você pode seguir meu conselho ou continuar pensando que sabe como o pgsql funciona e argumenta.
Scott Marlowe
@ user85116, ouça Scott, já temos um fluxo de trabalho com o MySQL que é super dependente da latência; atualmente, o MySQL está usando 64 GB de RAM para fazer essas consultas rapidamente, enquanto o mesmo pode ser alcançado no 2G Postgres com apenas visualizações materializadas. Armazenar em cache todo o banco de dados na RAM não resolverá o problema, apenas o tornará menos visível. Se você tiver os mesmos problemas na estrutura do banco de dados, o Postgres não corrigirá isso para você nem tentará ocultá-lo.
kworr 24/04