2012-04-28 27 views
5

He estado tratando de configurar PgPool para aceptar solicitudes de aproximadamente 150. El servidor de Postgres está configurado para aceptar solo 100 conexiones. Cualquier cosa más allá de 100 necesita ser agrupada por PgPool. Parece que no entiendo eso. Solo requiero que PgPool haga cola en las solicitudes, mi configuración actual no hace eso. De mi prueba de JMeter, cuando trato de obtener conexión más allá de 100, postgres me da un error diciendo error de PSQL: sorry, too many clients.Una buena configuración de PgPool II

Sólo he configurado PGPool con los siguientes parámetros:

listen_address = 'localhost' 
port = 9999 
backend_hostname0 = 'localhost' 
backend_port0 = 5432 
num_init_children = 100 
max_pool = 4 
child_life_time =120 
child_max_connections = 0 
connections_life_tome = 120 
client_idle_limit = 0 

Ya que sólo requieren pgPool a la cola de las solicitudes de conexiones adicionales, es la configuración anterior es correcta? Por favor asesórese sobre la configuración correcta.

+0

¿Está dirigido a la instancia de pgpool en su aplicación en lugar de conectarse directamente a Postgresql? –

+0

me estoy conectando al servidor de Postgres a través del puerto PGPool 9999 'jdbc: postgresql: // localhost: 9999/dbname? User = username & password = passwordofuser' –

Respuesta

2

Lo primero es averiguar cuál es el tamaño de piscina máximo que desea. El rendimiento de PostgreSQL (tanto en términos de rendimiento como de latencia) generalmente es mejor cuando el número máximo de conexiones activas está en algún lugar ((2 * número de núcleos) + conteo efectivo de husillo). El recuento eficaz de husillo puede ser difícil de entender: si su conjunto de datos activo está completamente en caché, cuente como cero, por ejemplo. No cuente los hilos adicionales de hyperthreading como núcleos para este cálculo. También tenga en cuenta que debido a problemas de latencia de la red, es posible que necesite un grupo un poco más grande que el número calculado para mantener ese número de conexiones activo. Es posible que necesite hacer algunos puntos de referencia para encontrar el punto óptimo para su hardware y carga de trabajo.

La configuración que necesita ajustar es child_max_connections, con num_init_children mantenida menor o igual a eso.

+0

2 * number-of-cores + effective-hindle-count ?? para el parámetro num_init_children? podrías dar un ejemplo? No estoy seguro de haberlo entendido. –

+0

Digamos que tiene un procesador de cuatro núcleos con hyperthreading. Son cuatro núcleos, por lo que probablemente pueda beneficiarse de hasta ocho conexiones de bases de datos activas. Supongamos que tiene un RAID 10 de seis unidades para datos. Si está totalmente en caché, probablemente no agregue nada, porque las unidades no se están utilizando para muchas lecturas aleatorias. Si está vinculado al disco, cuente eso como seis, consiguiendo 14 conexiones. Si está parcialmente en caché, el tamaño efectivo de la caché probablemente esté en algún punto intermedio. Comience desde allí y pruebe piscinas un poco más grandes y más pequeñas con su carga de trabajo. – kgrittn

+0

Bueno, esta afirmación de la wiki de PgPool me ayudó: - En resumen, max_pool, num_init_children, max_connections, superuser_reserved_connections deben cumplir la siguiente fórmula: max_pool * num_init_children <= (max_connections - superuser_reserved_connections) (no se necesita cancelar la consulta). i cambiado de configuración para 'listen_address = 'localhost' port = 9999 backend_hostname0 = 'localhost' backend_port0 = 5,432 num_init_children = 25 max_pool = 4 child_life_time = 120 child_max_connections = 100 connections_life_tome = 120 client_idle_limit = 25' –

4

La 'child_max_connections' en pgpool NO es la conexión máxima permitida a la base de datos. Es la cantidad de veces que se puede usar una conexión agrupada antes de que termine y se reinicie. Está ahí para reciclar los hilos de conexión y detener las pérdidas de memoria.

La fórmula de max_pool x num_init_children describe la cantidad máxima de conexiones que pgpool hará a Postgresql. Obviamente, esto tiene que ser menor que el 'max_connections' establecido en postgresql, de lo contrario, pgpool marca el DB como un backend no disponible. Y si tiene algunas conexiones de BD reservadas para uso de administrador, necesita reducir aún más el número de conexiones de pgpool.

Entonces, lo que estoy diciendo es que el 'max_connections' en la fórmula es el parámetro establecido en postgresql.conf. Establecer 'child_max_connections' a 100 en el comentario anterior solo significa que la conexión de pgpool se cierra y se vuelve a abrir cada 100 veces que se usa.

Cuestiones relacionadas