Django: CONN_MAX_AGE persiste le connessioni, ma non le riutilizza con PostgreSQL


16

Ho una configurazione di Django che utilizza Django 1.6.7 e Postgres 9.3 su Ubuntu 14.04 LTS.

In qualsiasi momento, il sito riceve circa 250 connessioni simultanee al database PostgreSQL, che è un Quad Core Xeon E5-2670 a 2,5 GHz e ha 16 GB di RAM. La media del carico su quella particolare macchina durante il giorno è di circa 20-30.

Occasionalmente ricevo e-mail in sentinella sui timeout delle connessioni al database e immagino che abilitare una sorta di pool di connessioni aiuterà a mitigare questo problema, oltre a ridurre un po 'il carico sul database.

Dal momento che stiamo usando Django 1.6, abbiamo a disposizione il pooling integrato. Tuttavia, quando imposto CONN_MAX_AGE su 10 secondi o 60 secondi, quasi immediatamente il numero di connessioni simultanee passa all'impostazione massima consentita (che è circa il doppio di quello che vediamo normalmente) e le connessioni iniziano a essere rifiutate.

Così, sembra per quale motivo mai, i collegamenti SONO persistono, ma NON SONO essere riutilizzato.

Quale potrebbe essere la causa di questo?

PS. Stiamo anche usando gunicorn con --worker-class = eventlet. Forse questa è la fonte dei nostri guai?

Risposte:


18

Facendo un po 'più di esperimenti, ho scoperto che la causa del nostro problema era proprio la classe operaia di gunicorn. Ogni microtappo creava la propria connessione persistente e non c'era modo di riutilizzare nessuno di essi.

La disabilitazione di eventlet ha fatto aumentare (ma non di molto) il carico sui nostri server web, ma il carico di postgres è ora sceso a una media di 3. Da 30.


2
Ci hai appena risparmiato un sacco di tempo! Osserviamo esattamente lo stesso comportamento e stiamo usando eventlet. Proverà a passare al pool di connessioni e vedere come funzionerà.
Silentser,

3
Aggiornamento: il pooling delle connessioni al database con pgBouncer sembra risolvere il problema (stiamo ancora utilizzando eventlet)
silentser

Apparentemente c'è anche psycogreen: pypi.python.org/pypi/psycogreen/1.0 (non l'ho provato perché una volta impostato CONN_MAX_AGE su zero ci vogliono 20ms per fare una connessione DB al nostro sistema, quindi non abbiamo semplicemente bisogno di un pool)
Darren,

1
Mi ci è voluto del tempo per cercare su Google questa risposta allo stesso identico problema che stavamo riscontrando.
Alper,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.