Come aumentare le connessioni massime in postgres?


108

Sto usando Postgres DB per il mio prodotto. Mentre eseguo l'inserimento in batch utilizzando slick 3, ricevo un messaggio di errore:

org.postgresql.util.PSQLException: IRREVERSIBILE: spiacenti, già troppi client.

La mia operazione di inserimento batch sarà più di migliaia di record. La connessione massima per il mio postgres è 100.

Come aumentare le connessioni massime?



Usa un pool di connessioni come pgBouncer o pgPool
Frank Heikens

2
1. Verificare innanzitutto se il middleware non mantiene aperte troppe connessioni o se le perde. 2. (forse) il prossimo utilizzo di un pool di connessioni. 3. (quasi) non aumentare mai il numero di connessioni consentite su questo tipo di problema, nella maggior parte dei casi questo peggiorerà le cose. (tranne se sei assolutamente sicuro)
joop

Risposte:


220

Solo aumentare max_connectionsè una cattiva idea. Devi aumentare anche shared_bufferse kernel.shmmax.


considerazioni

max_connectionsdetermina il numero massimo di connessioni simultanee al server database. L'impostazione predefinita è in genere 100 connessioni.

Prima di aumentare il numero di connessioni, potrebbe essere necessario aumentare la distribuzione. Ma prima, dovresti considerare se hai davvero bisogno di un limite di connessione maggiore.

Ogni connessione PostgreSQL consuma RAM per gestire la connessione o il client che la utilizza. Più connessioni hai, più RAM utilizzerai che potrebbe invece essere utilizzata per eseguire il database.

Un'app ben scritta in genere non richiede un numero elevato di connessioni. Se hai un'app che necessita di un gran numero di connessioni, considera l'utilizzo di uno strumento come pg_bouncer che può raggruppare le connessioni per te. Poiché ogni connessione consuma RAM, dovresti cercare di ridurre al minimo il loro utilizzo.


Come aumentare le connessioni massime

1. Aumenta max_connectioneshared_buffers

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

modificare

max_connections = 100
shared_buffers = 24MB

per

max_connections = 300
shared_buffers = 80MB

Il shared_buffersparametro di configurazione determina la quantità di memoria è dedicata a PostgreSQL da utilizzare per la memorizzazione nella cache di dati .

  • Se hai un sistema con 1 GB o più di RAM, un valore iniziale ragionevole per shared_buffers è 1/4 della memoria del tuo sistema.
  • è improbabile che troverai l'utilizzo di più del 40% della RAM per funzionare meglio di una quantità minore (come il 25%)
  • Tieni presente che se il tuo sistema o la build di PostgreSQL è a 32 bit, potrebbe non essere pratico impostare shared_buffer sopra 2 ~ 2,5 GB.
  • Nota che su Windows, i valori grandi per shared_buffer non sono altrettanto efficaci e potresti trovare risultati migliori mantenendolo relativamente basso e utilizzando invece di più la cache del sistema operativo. Su Windows l' intervallo utile è compreso tra 64 MB e 512 MB .

2. Modificare kernel.shmmax

Dovresti aumentare la dimensione massima del segmento del kernel in modo che sia leggermente più grande del file shared_buffers.

Nel file /etc/sysctl.confimpostare il parametro come mostrato di seguito. Avrà effetto al postgresqlriavvio (la riga seguente rende il kernel al massimo 96Mb)

kernel.shmmax=100663296

Riferimenti

Connessioni Postgres Max e Buffer Condivisi

Ottimizzazione del server PostgreSQL


Bella risposta. un paio di domande .. come fa 100663296 uguale a 96MB? e perché cambiamo shmmax cosa fa?
Robbo_UK

3
100663296 Byte = 96 MB (in binario). shmmax è la dimensione massima di un segmento di memoria condivisa . Ora, poiché abbiamo aumentato la dimensione dei buffer condivisi, dobbiamo cambiare shmmax per accogliere la maggiore memoria per la cache.
Ankit

1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel

6
Puoi usare PGTune per aiutarti a determinare queste impostazioni per il tuo sistema
Yoan Tournade

11
Controlla la tua attuale impostazione kernel.shmmax ( cat /proc/sys/kernel/shmmax) prima di cambiarla. Sui sistemi moderni è già impostato in modo ridicolo e non dovrebbe essere modificato. Il mio è impostato di 18446744073692774399default su Ubuntu 18.04.
Carl Zulauf

30

Aggiungendo alla grande risposta di Winnie,

Se qualcuno non è in grado di trovare il percorso del file postgresql.conf nel tuo setup, puoi sempre chiedere allo stesso postgres.

SHOW config_file;

Per me cambiare solo max_connections ha funzionato.


2
Grazie. In Ubuntu 18.04 è/etc/postgresql/11/main/postgresql.conf
gies0r

1

modificare la variabile max_connections nel file postgresql.conf situato in / var / lib / pgsql / data o / usr / local / pgsql / data /


2
Perché pg_hba.conf? Non ha alcun parametro sul numero di connessioni, solo come connettersi. postgresql.conf d'altra parte .... Ma centinaia di connessioni è una cattiva idea, non farlo, usa un pool di connessioni o soffri di problemi di prestazioni. PostgreSQL 8.3 è EOL da molti anni, per favore usa una versione aggiornata.
Frank Heikens,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.