Como aumentar as conexões máximas no postgres?

108

Estou usando o Postgres DB para meu produto. Ao fazer a inserção de lote usando slick 3, estou recebendo uma mensagem de erro:

org.postgresql.util.PSQLException: FATAL: desculpe, já há muitos clientes.

Minha operação de inserção de lote terá mais do que milhares de registros. A conexão máxima para meu postgres é 100.

Como aumentar as conexões máximas?

Jato
fonte
Use um pool de conexão como pgBouncer ou pgPool
Frank
2
1. Primeiro verifique se o seu middleware não está mantendo muitas conexões abertas ou se as está vazando. 2. (talvez) em seguida, use um pooler de conexão. 3. (quase) nunca aumente o número de conexões permitidas neste tipo de problema, na maioria dos casos isso vai piorar as coisas. (exceto se você tiver certeza absoluta)
joop

Respostas:

220

Aumentar max_connectionsé má ideia. Você precisa aumentar shared_bufferse kernel.shmmaxtambém.


Considerações

max_connectionsdetermina o número máximo de conexões simultâneas com o servidor de banco de dados. O padrão é normalmente 100 conexões.

Antes de aumentar sua contagem de conexões, você pode precisar aumentar sua implantação. Mas antes disso, você deve considerar se realmente precisa de um limite de conexão maior.

Cada conexão PostgreSQL consome RAM para gerenciar a conexão ou o cliente que a usa. Quanto mais conexões você tiver, mais RAM estará usando, que poderia ser usada para executar o banco de dados.

Um aplicativo bem escrito normalmente não precisa de um grande número de conexões. Se você tem um aplicativo que precisa de um grande número de conexões, considere usar uma ferramenta como o pg_bouncer, que pode agrupar conexões para você. Como cada conexão consome RAM, você deve procurar minimizar seu uso.


Como aumentar o máximo de conexões

1. Aumente max_connectioneshared_buffers

no /var/lib/pgsql/{version_number}/data/postgresql.conf

mudança

max_connections = 100
shared_buffers = 24MB

para

max_connections = 300
shared_buffers = 80MB

O shared_buffersparâmetro de configuração determina quanta memória é dedicada ao PostgreSQL a ser usada para armazenamento de dados em cache .

  • Se você tem um sistema com 1 GB ou mais de RAM, um valor inicial razoável para shared_buffers é 1/4 da memória em seu sistema.
  • é improvável que você descubra usando mais de 40% de RAM para funcionar melhor do que uma quantidade menor (como 25%)
  • Esteja ciente de que se o seu sistema ou construção PostgreSQL for de 32 bits, pode não ser prático definir shared_buffers acima de 2 ~ 2,5 GB.
  • Note que no Windows, valores grandes para shared_buffers não são tão eficazes, e você pode encontrar melhores resultados mantendo-o relativamente baixo e usando mais o cache do sistema operacional. No Windows, o intervalo útil é de 64 MB a 512 MB .

2. Altere kernel.shmmax

Você precisaria aumentar o tamanho máximo do segmento do kernel para ser ligeiramente maior que o shared_buffers.

No arquivo, /etc/sysctl.confdefina o parâmetro conforme mostrado abaixo. Ele terá efeito quando postgresqlreinicializar (a linha a seguir torna o kernel máximo 96Mb)

kernel.shmmax=100663296

Referências

Conexões máximas de Postgres e buffers compartilhados

Ajustando seu servidor PostgreSQL

Ankit
fonte
Ótima resposta. algumas perguntas .. como 100663296 é igual a 96 MB? e por que mudamos shmmax o que isso faz?
Robbo_UK
3
100663296 Bytes = 96 MB (em binário). shmmax é o tamanho máximo de um segmento de memória compartilhada . Agora, como aumentamos o tamanho dos buffers compartilhados, precisamos alterar shmmax para acomodar o aumento de memória para armazenamento em cache.
Ankit
1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel de
6
Você pode usar PGTune para ajudá-lo a determinar essas configurações para o seu sistema
Yoan Tournade
11
Verifique sua configuração atual de kernel.shmmax ( cat /proc/sys/kernel/shmmax) antes de alterá-la. Em sistemas modernos, ele já está ridiculamente alto e não deve ser alterado. O meu é definido como 18446744073692774399padrão no Ubuntu 18.04.
Carl Zulauf
30

Adicionando à ótima resposta de Winnie,

Se alguém não conseguir encontrar a localização do arquivo postgresql.conf em sua configuração, você pode sempre perguntar ao próprio postgres.

SHOW config_file;

Para mim, mudar o max_connections sozinho fez o truque.

Jinxer Albatross
fonte
2
Obrigado. No Ubuntu 18.04, é/etc/postgresql/11/main/postgresql.conf
gies0r
1

altere a variável max_connections no arquivo postgresql.conf localizado em / var / lib / pgsql / data ou / usr / local / pgsql / data /

Archana
fonte
2
Por que pg_hba.conf? Não tem nenhum parâmetro sobre o número de conexões, apenas como conectar. postgresql.conf por outro lado .... Mas centenas de conexões é uma má ideia, não faça isso, use um pool de conexão ou tenha problemas de desempenho. PostgreSQL 8.3 é EOL por muitos anos, por favor, use uma versão atualizada.
Frank Heikens