ERRORE PostgreSQL: non sono consentite più connessioni


19

Come liberare le connessioni PostgreSQL che non vengono chiuse correttamente dalle applicazioni client?

Ho un'app di data mining che ruota su più processi, tutte le connessioni a un database PostgreSQL 9.1 locale per recuperare i dati. Funziona bene per alcune ore, ma poi muore con l'errore:

FATAL:  remaining connection slots are reserved for non-replication superuser connections

La ricerca mostra che ciò è molto probabilmente causato dall'app che non chiude correttamente le sue connessioni. Tuttavia, anche con l'app uccisa, queste connessioni non vengono mai liberate. Non esiste una sorta di timeout in cui PostgreSQL chiuderà automaticamente una connessione?

Ho anche provato ad aumentare le max_connections di Postgres da 100 a 200, ma il riavvio mi ha dato l'errore:

2014-02-23 10:51:15 EST FATAL:  could not create shared memory segment: Invalid argument
2014-02-23 10:51:15 EST DETAIL:  Failed system call was shmget(key=5432001, size=36954112, 03600).
2014-02-23 10:51:15 EST HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 36954112 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
    The PostgreSQL documentation contains more information about shared memory configuration.

Il mio sistema è Ubuntu 12.04 e ha 8 GB di memoria e tutte le altre impostazioni PG sono predefinite, quindi non sono sicuro del motivo per cui pensa che il sistema non abbia memoria sufficiente.

Ho quindi provato a utilizzare pgbouncer per raggruppare e riutilizzare le connessioni. Questo sembra funzionare un po 'meglio, ma alla fine anche questo ha esaurito le connessioni, dandomi l'errore:

ERROR:  no more connections allowed

Come posso diagnosticare e risolvere ulteriormente questo problema?


Mostra l'output di pg_stat_activity
ETL

Risposte:


8

È possibile aumentare il numero massimo di connessioni modificando le impostazioni di memoria condivisa massima, tuttavia se il problema è che le connessioni non vengono chiuse, è necessario risolverlo. Se il software è fuori dal tuo controllo ed è difettoso non chiudendo le connessioni, puoi usare un cron job come:

select pg_terminate_backend(procpid)
from pg_stat_activity
where usename = 'yourusername'
 and current_query = '<IDLE>'
 and query_start < current_timestamp - interval '5 minutes'
;

Questo è quello che faccio per eliminare le connessioni che perdono da un simile software difettoso.

In alternativa, potresti essere in grado di eseguire il tuo software buggy attraverso un pool di connessioni che ha una funzionalità simile per interrompere le connessioni inattive come pgpool.

Nota : le versioni più recenti di Postgres hanno nomi di colonne leggermente diversi:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOURDATABASEUSERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Dovrebbe funzionare su 9.6? Quando provo ottengopostgres=> select pg_terminate_backend(procpid) from pg_stat_activity where current_query = '<IDLE>' and query_start < current_timestamp - interval '5 minutes'; ERROR: column "procpid" does not exist LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity ...
Magick l'

È pidinvece che procpidnelle versioni più recenti.
ETL

4

Per le versioni più recenti di PostgreSQL:

select pg_terminate_backend(pid)
from pg_stat_activity
where usename = 'YOUR_DATABASE_USERNAME*'
 and state = 'idle'
 and query_start < current_timestamp - interval '5 minutes'
;

Quanto sopra ti aiuterà a terminare le connessioni inattive. Ho avuto lo stesso problema ma si è rivelato un problema con il mio modo Flask e SQLAlchemy per connettermi al database.

* il nome utente non è un errore di battitura


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.