¿Cómo aumentar las conexiones máximas en postgres?

108

Estoy usando Postgres DB para mi producto. Mientras hago la inserción por lotes usando slick 3, recibo un mensaje de error:

org.postgresql.util.PSQLException: FATAL: lo siento, ya hay demasiados clientes.

Mi operación de inserción por lotes tendrá más de miles de registros. La conexión máxima para mi postgres es 100.

¿Cómo aumentar las conexiones máximas?

Jet
fuente
Use un grupo de conexiones como pgBouncer o pgPool
Frank Heikens
2
1. Primero verifique si su middleware no mantiene abiertas demasiadas conexiones o las está filtrando. 2. (tal vez) a continuación, utilice un agrupador de conexiones. 3. (casi) nunca aumente la cantidad de conexiones permitidas en este tipo de problema, en la mayoría de los casos esto empeorará las cosas. (excepto si está absolutamente seguro)
joop

Respuestas:

220

Solo aumentar max_connectionses una mala idea. Necesitas aumentar shared_buffersy kernel.shmmaxtambién.


Consideraciones

max_connectionsdetermina el número máximo de conexiones simultáneas al servidor de la base de datos. El valor predeterminado suele ser 100 conexiones.

Antes de aumentar el recuento de conexiones, es posible que deba ampliar su implementación. Pero antes de eso, debe considerar si realmente necesita un límite de conexión mayor.

Cada conexión de PostgreSQL consume RAM para administrar la conexión o el cliente que la usa. Cuantas más conexiones tenga, más RAM utilizará, que podría utilizarse para ejecutar la base de datos.

Por lo general, una aplicación bien escrita no necesita una gran cantidad de conexiones. Si tiene una aplicación que necesita una gran cantidad de conexiones, considere usar una herramienta como pg_bouncer, que puede agrupar las conexiones por usted. Como cada conexión consume RAM, debería intentar minimizar su uso.


Cómo aumentar las conexiones máximas

1. Incrementar max_connectionyshared_buffers

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

cambio

max_connections = 100
shared_buffers = 24MB

a

max_connections = 300
shared_buffers = 80MB

El shared_buffersparámetro de configuración determina cuánta memoria se dedica a PostgreSQL para usar para almacenar datos en caché .

  • Si tiene un sistema con 1 GB o más de RAM, un valor inicial razonable para shared_buffers es 1/4 de la memoria de su sistema.
  • Es poco probable que el uso de más del 40% de RAM funcione mejor que una cantidad menor (como el 25%)
  • Tenga en cuenta que si su sistema o la compilación de PostgreSQL es de 32 bits, puede que no sea práctico establecer shared_buffers por encima de 2 ~ 2.5GB.
  • Tenga en cuenta que en Windows, los valores altos para shared_buffers no son tan efectivos, y puede encontrar mejores resultados manteniéndolo relativamente bajo y usando más la caché del sistema operativo. En Windows, el rango útil es de 64 MB a 512 MB .

2. Cambie kernel.shmmax

Necesitaría aumentar el tamaño del segmento máximo del kernel para que sea un poco más grande que el shared_buffers.

En el archivo, /etc/sysctl.confconfigure el parámetro como se muestra a continuación. Tendrá efecto cuando se postgresqlreinicie (la siguiente línea hace que el kernel alcance el máximo 96Mb)

kernel.shmmax=100663296

Referencias

Conexiones máximas de Postgres y búferes compartidos

Ajuste de su servidor PostgreSQL

Ankit
fuente
gran respuesta. un par de preguntas ... ¿cómo es 100663296 igual a 96 MB? y por qué cambiamos shmmax, ¿qué hace eso?
Robbo_UK
3
100663296 Bytes = 96 MB (en binario). shmmax es el tamaño máximo de un segmento de memoria compartida . Ahora, debido a que aumentamos el tamaño de los búferes compartidos, necesitamos cambiar shmmax para acomodar la memoria aumentada para el almacenamiento en caché.
Ankit
1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel
6
Puede usar PGTune para ayudarlo a determinar estas configuraciones para su sistema
Yoan Tournade
11
Verifique su configuración actual de kernel.shmmax ( cat /proc/sys/kernel/shmmax) antes de cambiarla. En los sistemas modernos, ya está ridículamente alto y no debe cambiarse. El mío está configurado 18446744073692774399de forma predeterminada en Ubuntu 18.04.
Carl Zulauf
30

Añadiendo a la gran respuesta de Winnie,

Si alguien no puede encontrar la ubicación del archivo postgresql.conf en su configuración, siempre puede preguntar al propio postgres.

SHOW config_file;

Para mí, cambiar las max_connections solo hizo el truco.

Albatros de Jinxer
fuente
2
Gracias. En Ubuntu 18.04 es/etc/postgresql/11/main/postgresql.conf
gies0r
1

cambie la variable max_connections en el archivo postgresql.conf ubicado en / var / lib / pgsql / data o / usr / local / pgsql / data /

Archana
fuente
2
¿Por qué pg_hba.conf? No tiene ningún parámetro sobre la cantidad de conexiones, solo cómo conectarse. postgresql.conf por otro lado .... Pero cientos de conexiones es una mala idea, no lo hagas, no uses un grupo de conexiones o sufras problemas de rendimiento. PostgreSQL 8.3 es EOL durante muchos años, utilice una versión actualizada.
Frank Heikens