首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >烧瓶,金牛(gevent),sqlalchemy (postgresql):太多连接

烧瓶,金牛(gevent),sqlalchemy (postgresql):太多连接
EN

Server Fault用户
提问于 2020-04-14 07:12:00
回答 1查看 2.2K关注 0票数 1

我创建了Flask WSGI应用程序,它使用gunicorn作为WSGI服务器,对于DB,它通过Flask SQLAlchemy扩展使用PostgreSQL。这些都是在Heroku上托管的。

gunicorn配置

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

Heroku PostgreSQL configuration

  • 最大连接数: 20。

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

我得到了一个错误:sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: too many connections for role <id>。显然,我超过了允许的DB连接数。

我试过这些东西来修复它:

  • 对于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)。

这些都不管用。我仍然得到这个错误,即使是最低配置(一个工人与18个连接)。我真的开始不明白到底发生了什么。

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

问题

  • 如何修复此错误?
  • SQLAlchemy池如何与gevent工作人员一起工作?也就是说,如何计算最大的DB连接数?
  • 我应该如何正确地配置它,使其按预期工作?
EN

回答 1

Server Fault用户

发布于 2021-09-14 17:27:55

你提到:

  • worker connections = 1024
  • threads = 1

但是对于gevent,工作连接的数量是一次运行的(异步)线程的总数。

因此,您试图根据定义的workers * worker_connectionspostgres限制来建立连接的pool_size数量,这肯定比您所能承受的要高。

从Postgres开始并向后工作:

  • Postgres =20个连接
  • 实例=1(看起来是这样)?
  • gunicorn过程=2
  • worker_connections = 10 = (20 / 2)
  • pool_size + max_overflow = 10 相同于worker_connections好了!
  • pool_size = 10, max_overflow=0或任何你想要的组合,
    • 溢出连接被尽快清除;pool_size连接可以停留在周围。

worker_connectionspool_size+max_overflow在线程之间共享,但进程不共享。

注意,一旦您添加了另一个实例或任何与DB对话的内容,它将使用那些宝贵的20个Postgres连接中的1个(或更多),因此您需要相应地进行调整。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1012203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档