Django:CONN_MAX_AGE保持连接,但不与PostgreSQL重用


17

我有一个Django设置,在Ubuntu 14.04 LTS上使用Django 1.6.7和Postgres 9.3。

在任何给定时间,该站点都可以同时与PostgreSQL数据库建立约250个连接,该数据库是2.5GHz的Quad Core Xeon E5-2670,内存为16GB。该特定机器全天的平均负载约为20到30。

有时,我会收到关于连接超时到数据库的消息,并且我认为启用某种连接池将有助于减轻此问题,并稍微降低数据库的负载。

由于我们使用的是Django 1.6,因此我们可以使用内置池。但是,当我将CONN_MAX_AGE设置为10秒或60秒时,并发连接数几乎立即跳到允许的最大设置(大约是我们通常看到的两倍),并且连接开始被拒绝。

所以,出现什么都原因,连接ARE坚持,但他们被重用。

这可能是什么原因?

PS。我们也将gunicorn与--worker-class = eventlet一起使用。也许这就是我们困扰的根源?

Answers:


18

经过更多的实验,我发现导致问题的原因确实是gunicorn的eventlet工人阶级。每个微线程都建立了自己的持久连接,根本无法重用它们中的任何一个。

禁用eventlet使我们的Web服务器上的负载增加了(但增加不多),但是postgres负载现在平均下降到了3。从30开始。


2
您为我们节省了很多时间!我们观察到完全相同的行为,并且我们正在使用eventlet。将尝试切换到连接池,看看它如何工作。
silentser

3
更新:集中与pgBouncer数据库连接似乎解决问题(我们仍然使用eventlet)
silentser

显然还有psycogreen:pypi.python.org/pypi/psycogreen/1.0(将CONN_MAX_AGE设置为零后,我们花了20ms的时间建立数据库连接,因此我们根本不需要池化,因此我没有尝试过)
达伦(Darren)2016年

1
我花了一些时间来寻找答案,以解决我们遇到的完全相同的问题。
Alper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.