Django: CONN_MAX_AGE persiste conexões, mas não as reutiliza com o PostgreSQL

11

Eu tenho uma configuração do django usando o Django 1.6.7 e o Postgres 9.3 no Ubuntu 14.04 LTS.

A qualquer momento, o site recebe aproximadamente 250 conexões simultâneas com o banco de dados PostgreSQL, que é um Quad Core Xeon E5-2670 a 2.5GHz, e tem 16GB de RAM. A carga média nessa máquina em particular ao longo do dia é de cerca de 20 a 30.

Ocasionalmente, recebo e-mails em sentry sobre conexões com tempo limite para o banco de dados, e acho que habilitar algum tipo de pool de conexões ajudará a atenuar esse problema, bem como diminuir um pouco a carga no banco de dados.

Como estamos usando o Django 1.6, temos o pool integrado disponível para nós. No entanto, quando eu definir CONN_MAX_AGE para 10 segundos ou 60 segundos, quase imediatamente o número de conexões simultâneas salta para a configuração máxima permitida (que é aproximadamente o dobro do que normalmente vemos) e as conexões começam a ser rejeitadas.

Então, parece que, por qualquer motivo, as conexões ARE persistem, mas elas NÃO estão sendo reutilizadas.

Qual poderia ser a causa disso?

PS. Nós também estamos usando gunicorn com --worker-class = eventlet. Talvez esta seja a fonte de nossos problemas?

    
por synic 10.10.2014 / 17:00

1 resposta

13

Fazendo mais algumas experiências, descobri que a causa do nosso problema era de fato a classe trabalhadora do eventlet da gunicorn. Cada microtesmo fez sua própria conexão persistente e não havia como reutilizar nenhum deles.

A desativação do eventlet aumentou a carga de nossos servidores da Web (mas não muito), mas a carga do postgres agora está em uma média de 3. A partir de 30.

    
por 10.10.2014 / 18:50