flask、gunicorn (gevent)、sqlalchemy (postgresql):连接太多

Imm*_*ion 9 python postgresql sqlalchemy flask gunicorn

我创建了用作 WSGI 服务器的FlaskWSGI 应用程序gunicorn,用于PostgreSQL通过Flask SQLAlchemy扩展使用的 DB 。这一切都托管在Heroku.

枪炮配置

  • 工人人数:2人;
  • 工人连接数:1024;
  • 线程数:1;
  • 工人阶级:gevent。

Heroku PostgreSQL 配置

  • 最大连接数:20。

对于其他一切,使用默认配置。

我收到此错误:sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: too many connections for role <id>。显然,我超出了允许的数据库连接数。

我尝试了这些东西来修复它:

  • 对于 SQLAlchemy 设置poolclass为NullPool;
  • SQLAlchmey 设置pool_recycle为 2。即使超过 2 秒,连接数仍然相同;
  • session.close()与engine.dispose();
  • 工人数量 - 2,工人连接数量 - 9;
  • 工人数量 - 1,工人连接数量 - 18;
  • 工人数 - 1,工人连接数 - 10, SQLAlchemy max_overflow = 0, SQLALchmey pool_size = 10(我收到此错误:)sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 0 reached, connection timed out, timeout 30。

这一切都不起作用。即使使用最小的 gunicorn 配置(1 个具有 18 个连接的工人),我仍然收到此错误。我真的开始不明白到底发生了什么。

我认为它是这样工作的:每个工人都有自己的引擎实例,每个引擎都有自己的池大小。因此,如果有 2 个具有引擎默认配置的 worker(池大小为 5),那么我们有 2 * 5 = 10 个与 DB 的最大连接。但看起来这真的不是这个样子。

问题

  • 如何修复这个错误?
  • SQLAlchemy池如何与gevent工人一起工作?即,我如何计算数据库连接的最大数量?
  • 我应该如何正确配置它以使其按预期工作?

抱歉问了太多问题,但这真的让我很沮丧。