Django:CONN_MAX_AGE 保留连接,但不会与 PostgreSQL 一起重用它们

Django:CONN_MAX_AGE 保留连接,但不会与 PostgreSQL 一起重用它们

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

在任何给定时间,该网站都会获得大约 250 个与 PostgreSQL 数据库的同时连接,该数据库是 2.5GHz 四核 Xeon E5-2670,并具有 16GB 内存。该特定机器全天的平均负载约为 20 到 30。

有时我会在哨兵中收到有关数据库连接超时的电子邮件,我认为启用某种连接池将有助于缓解此问题,并稍微降低数据库的负载。

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

因此,无论出于什么原因,坚持不懈,但他们不是被重复使用。

这可能是什么原因造成的?

PS:我们还使用带有 --worker-class=eventlet 的 gunicorn。也许这就是我们烦恼的根源?

答案1

经过进一步的实验,我发现问题确实出在 gunicorn 的 eventlet worker 类上。每个微线程都建立了自己的持久连接,根本无法重用其中任何一个。

禁用 eventlet 会导致我们的网络服务器负载增加(但幅度不大),但 postgres 负载现在已从平均 30 下降到平均 3。

答案2

您能帮助我解决一些疑问吗,因为我面临同样的问题。

  1. 您是否认为,如果我们使用带有 --worker-class=eventlet 的 gunicorn,CONN_MAX_AGE 将不起作用?
  2. 有什么解决方案吗,因为我不想在每个请求上打开和关闭连接,有没有办法重用连接(我们可以在 django 中使用单例连接吗)?

相关内容