17 votos

PostgreSQL ERROR: no hay más conexiones permitidas

Cómo se PostgreSQL conexiones que no son propiamente de ser cerrado por las aplicaciones cliente?

Tengo una minería de datos de la aplicación que gira en varios procesos, toda la conexión a un local de PostgreSQL 9.1 de la base de datos para recuperar los datos. Funciona muy bien para un par de horas, pero luego muere con el error:

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

La investigación de esta muestra que esta es la causa más probable de la aplicación no cerrar adecuadamente sus conexiones. Sin embargo, incluso con la aplicación de muertos, estas conexiones nunca se liberan. ¿No hay algún tipo de tiempo de espera, donde PostgreSQL se cerrará automáticamente una conexión?

También probé el aumento de Postgres del max_connections de 100 a 200, pero reiniciar me dio el error:

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.

Mi sistema es Ubuntu 12.04 y tiene 8GB de memoria, y todos los demás PG ajustes son los valores predeterminados, así que no estoy seguro de por qué se piensa que el sistema no tiene suficiente memoria.

Luego traté de usar pgbouncer a la piscina y reutilizar las conexiones. Esto parecía funcionar un poco mejor, pero incluso esto, finalmente, se quedó fuera de las conexiones, me da el error:

ERROR:  no more connections allowed

¿Cómo puedo seguir a diagnosticar y solucionar este problema?

3voto

ETL Puntos 3418

Usted puede aumentar el número máximo de conexiones por el cambio de su máximo de memoria compartida configuración, sin embargo, si el problema es que las conexiones no están cerrados, entonces usted realmente debería resolver. Si el software está fuera de su control y se buggy por no cerrar las conexiones, puede utilizar algunos de los trabajos cron como:

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

Que es lo que tengo que hacer para matar a fugas en las conexiones del software defectuoso.

Alternativamente, usted puede ser capaz de ejecutar su buggy software a través de una conexión de la piscina que tiene una funcionalidad similar para matar las conexiones inactivas como pgpool.

0voto

vedic Puntos 176

Documento de PG en el manejo de los recursos del núcleo. Esta debe ayudarle a aumentar el límite de memoria en el kernel.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: