2012-04-28 14 views
5

Ho cercato di configurare PgPool per accettare una richiesta di circa 150. Il server Postgres è configurato per accettare solo 100 connessioni. Qualsiasi cosa oltre 100 deve essere raggruppata da PgPool. Non mi sembra di averlo capito. Richiedo solo a PgPool di accodare le richieste, la mia configurazione attuale non lo fa. Dal mio test JMeter, quando provo a ottenere la connessione oltre 100, Postgres mi dà un errore che dice errore PSQL: sorry, too many clients.Una buona configurazione di PgPool II

Ho solo hanno configurato pgpool con i seguenti parametri:

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 

Dal momento che solo richiedono pgpool fare la fila alle richieste connessioni in più, è la configurazione di cui sopra è corretto? Si prega di avvisare sulla corretta configurazione.

+0

È l'istanza di pgpool di destinazione nell'applicazione invece di connettersi direttamente a Postgresql? –

+0

mi sto connettendo al server postgres tramite la porta PGPool 9999 'jdbc: postgresql: // localhost: 9999/nome_db? User = nomeutente & password = passwordofuser' –

risposta

2

La prima cosa è capire che cosa si desidera come dimensione massima del pool. Le prestazioni di PostgreSQL (sia in termini di throughput che di latenza) sono solitamente migliori quando il numero massimo di connessioni attive è da qualche parte intorno ((2 * numero di core) + conteggio dell'effettivo-mandrino). Il conteggio del mandrino effettivo può essere difficile da capire, ad esempio se il set di dati attivo è completamente memorizzato nella cache, contarlo come zero. Non contare nessun thread aggiuntivo da hyperthreading come core per questo calcolo. Si noti inoltre che a causa di problemi di latenza della rete, potrebbe essere necessario un pool leggermente più grande del numero calcolato per mantenere il numero di connessioni attivo. Potrebbe essere necessario fare alcuni benchmark per trovare il punto debole per l'hardware e il carico di lavoro.

L'impostazione che è necessario regolare è child_max_connections, con num_init_children mantenuta inferiore o uguale a quella.

+0

2 * numero di core + conteggio-mandrino effettivo ?? per il parametro num_init_children? potresti fare un esempio? non sono sicuro di aver capito ... –

+0

Diciamo che hai un processore quad core con hyperthreading. Si tratta di quattro core, quindi è possibile trarre vantaggio da un massimo di otto connessioni al database attive. Supponiamo che tu abbia un RAID 10 a sei dischi per i dati. Se si è completamente memorizzati nella cache, probabilmente non si aggiunge nulla, poiché le unità non vengono utilizzate per molte letture casuali. Se sei legato al disco, allora conta come sei, portandoti a 14 connessioni. Se si è parzialmente nella cache, la dimensione della cache effettiva è probabilmente una via di mezzo. Inizia da lì e prova piscine leggermente più grandi e più piccole con il tuo carico di lavoro. – kgrittn

+0

Beh, questa dichiarazione del wiki pgpool mi ha aiutato: - in sintesi, max_pool, num_init_children, max_connections, superuser_reserved_connections devono soddisfare la seguente formula: max_pool * num_init_children <= (max_connections - superuser_reserved_connections) (nessuna query cancellazione di bisogno). ho cambiato la mia configurazione di 'listen_address = 'localhost' port = 9999 backend_hostname0 = 'localhost' backend_port0 = 5432 num_init_children = 25 max_pool = 4 child_life_time = 120 child_max_connections = 100 connections_life_tome = 120 client_idle_limit = 25' –

4

"child_max_connections" in pgpool NON è la connessione massima consentita al DB. È il numero di volte in cui una connessione in pool può essere utilizzata prima che termini e riavvii. È lì per riciclare i thread di connessione e fermare le perdite di memoria.

La formula di max_pool x num_init_children descrive il numero massimo di connessioni che pgpool farà a Postgresql. Ovviamente, questo deve essere inferiore al 'max_connections' impostato in postgresql, altrimenti pgpool contrassegna il DB come un backend non disponibile. E se si dispone di alcune connessioni DB riservate per l'utilizzo da parte dell'amministratore, è necessario ridurre ulteriormente il numero di connessioni pgpool.

Quindi, quello che sto dicendo è che il 'max_connections' nella formula è il parametro impostato in postgresql.conf. L'impostazione di "child_max_connections" su 100 nel commento sopra indica semplicemente che la connessione pgpool viene chiusa e riaperta ogni 100 volte utilizzata.

Problemi correlati