Re: Recomendación sobre el tiempo idle de las conexiones

From: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
To: "Ivan Perales M(dot)" <ivan(dot)perales(at)gmail(dot)com>
Cc: Ayuda Esp PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Recomendación sobre el tiempo idle de las conexiones
Date: 2015-08-13 19:12:10
Message-ID: 20150813191210.GE5232@alvherre.pgsql
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ivan Perales M. escribió:

> Tengo un software el cua maneja bases de datos dinámicas, es decir, una
> base de datos fija principal y se crea una base de datos por cada cliente
> que se registra en el programa. El software está desarrollado en java y
> utilizo BasiDataSource de apache como pool de conexiones para cada base de
> datos.

Partiste mal con ese diseño. Podrías haber usado un esquema por cliente
para ahorrarte todo el lío de las conexiones. Para "cambiar" de
cliente, en lugar de crear una conexión nueva simplemente modificarías
la variable search_path usando SET.

> El software es también cliente-servidor, lo que significa que un usuario
> puede estar trabajando con una base de datos y otro usuario con otra, lo
> que significa que se tienen una o más conexiones por cada base de datos,
> mas aparte un usuario puede switchear entre clientes con solo seleccionarlo
> de un listado, lo que implica crear conexiones a esa base de datos si nadie
> la estaba usando.

Suena bastante mal.

> Hace poco noté que un cliente del software registró mas de 100 clientes en
> el programa, y pusieron a una muchacha a cargar cierta información a cada
> cliente, por lo que se crearon 1 conexión por cada base y a eso le sumamos
> que otros usuarios estaban trabajando con algunos clientes, pues algunas
> bases de datos llegaron a tener hasta 5 conexiones. Llego un momento en que
> se superaron las 100 conexiones predeterminadas para usuarios regulares que
> ya no se pudo trabajar en muchos clientes. Al checar en pg_stat_activity
> efectivamente estaban 99 conexiones. El ultimo uso de la mayoria de
> conexiones tenia varios minutos, de entre 3 hasta 10, por lo que
> seguramente fueron las primeras bases de datos que se abrieron.

Lo que quizás podrías hacer como parche inmediato es asegurarte que las
conexiones se cierran lo más pronto posible. De hecho, quizás no
deberías intentar mantener conexiones abiertas en absoluto, sino más
bien abrirla cada vez que la vayas a utilizar. Esto no es nada
eficiente, pero sería una ayuda contra el exceso de conexiones abiertas.

> Lo que me gustaria me aconsejaran es a decidir si aumento el numero de
> conexiones para usuarios regulares u optimizo los datasource para que
> cierren la conexión a por decir 2 o 3 minutos de que no se utilize.

¿2 a 3 segundos quieres decir?

> No se
> que tanto le impacte al performance que se esten abriendo nuevas conexiones
> en lugar de mantenerlas abiertas, por poner un ejemplo un usuario genera un
> reporte y comienza a analizar la información, puede llevar 10 segundos en
> lo que genera otro reporte para mejorar el análisis ó puede llevarse mas de
> 10 minutos.

Cada conexión se demora unos pocos milisegundos en abrirse. Si tu
servidor no está al 100% de carga, el aumento de carga no será notorio.

Si pones un pooler como sugiere Anthony, puedes abrir una nueva conexión
por cada transacción (por cada query?) y no notarás prácticamente
ninguna diferencia.

Una solución de largo plazo sería reconsiderar la idea de tener bases de
datos separadas.

--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Anthony Sotolongo 2015-08-13 19:12:38 Re: Recomendación sobre el tiempo idle de las conexiones
Previous Message Ivan Perales M. 2015-08-13 18:52:24 Re: [pgsql-es-ayuda] Recomendación sobre el tiempo idle de las conexiones