Processo filho do Postgres consumindo muita memória

2

Temos uma instância postgres 9.0 que está sendo executada em uma máquina bastante robusta (96G de RAM / 24 núcleos). Nas últimas semanas, tivemos falhas devido a processos infantis de postgres sendo mortos com memória insuficiente pelo OOM killer. Parece que, devido ao uso do pool de conexão, esses processos filhos são de longa duração (o que faz sentido, já que abrir e fechar as conexões leva tempo), o problema é que eles estão crescendo gradualmente no consumo de memória para atingir até 9Gigs / process. Como você pode imaginar, com 10 deles, preenche o carneiro disponível e o chute assassino.

As perguntas são:

  1. se estivermos usando o parâmetro de configuração padrão, como é possível que o processo aloque tanta memória?
  2. por que esses processos não estão liberando a memória?

Para referência, configurações que podem influenciar a memória:

max_connections = 950
shared_buffers = 32MB

Todas as outras configurações não são substituídas, o que significa que estamos usando padrões.

    
por Bartosz Radaczyński 19.09.2012 / 14:12

1 resposta

3

A primeira coisa a considerar seria aumentar shared_buffers caminho para cima, pelo menos para 1GB e, possivelmente, muito mais, até 25% da memória principal. Isso é o que o documento diz .

Com apenas 32MB, dos quais ~ 18Mb já serão usados apenas para lidar com max_connections a 950, os processos filhos têm acesso a pouca memória compartilhada suficiente para compartilhar qualquer coisa.

Isso pode ou não atenuar o problema de consumo de memória para sua carga de trabalho e situação específicas, mas, de qualquer forma, isso é um passo na direção certa. O valor atual é insanamente baixo.

Sobre a OOM especificamente, você pode considerar as soluções alternativas oferecidas no Linux Overcommit Memory seção do documento. Note, no entanto, que é um parágrafo curto para um problema complexo. Há mais, por exemplo, nesta postagem do blog e seus comentários com dicas para entender o contexto e as compensações envolvidas na limitação ou desativação da OOM.

Além disso, um vazamento de memória no Postgres é sempre possível. Você precisa ter certeza de que está executando a versão secundária mais recente, caso ela já esteja corrigida. As notas de lançamento que acompanham cada bugfix-release definitivamente mencionam vazamentos de memória de tempos em tempos.

    
por 20.09.2012 / 06:15