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

syn*_*nic 23 postgresql django postgresql-9.3

我有一个 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 秒时,同时连接的数量几乎立即跳到允许的最大设置(大约是我们通常看到的两倍),并且连接开始被拒绝。

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

这可能是什么原因?

附注。我们还使用带有 --worker-class=eventlet 的 gunicorn。也许这就是我们痛苦的根源?

syn*_*nic 24

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

禁用 eventlet 使我们的网络服务器上的负载上升(但幅度不大),但 postgres 负载现在下降到平均 3。从 30。

  • 更新:使用 pgBouncer 池化数据库连接似乎解决了问题(我们仍在使用 eventlet) (3认同)
  • 您刚刚为我们节省了大量时间!我们观察到完全相同的行为,我们正在使用 eventlet。将尝试切换到连接池并查看它将如何工作。 (2认同)
  • 我花了一些时间在谷歌上搜索这个答案来解决我们遇到的完全相同的问题。 (2认同)