我创建了Flask
WSGI应用程序,它使用gunicorn
作为WSGI服务器,对于DB,它通过Flask SQLAlchemy
扩展使用PostgreSQL
。这些都是在Heroku
上托管的。
对于其他一切,都使用默认配置。
我得到了一个错误:sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: too many connections for role <id>
。显然,我超过了允许的DB连接数。
我试过这些东西来修复它:
poolclass
设置为NullPool
;pool_recycle
设置为2。即使在超过2秒之后,连接的数量仍然相同;session.close()
与engine.dispose()
;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连接数?发布于 2021-09-14 17:27:55
你提到:
worker connections = 1024
threads = 1
但是对于gevent
,工作连接的数量是一次运行的(异步)线程的总数。
因此,您试图根据定义的workers * worker_connections
和postgres
限制来建立连接的pool_size
数量,这肯定比您所能承受的要高。
从Postgres开始并向后工作:
gunicorn
过程=2worker_connections
= 10 = (20 / 2)pool_size + max_overflow
= 10 相同于worker_connections
好了!pool_size = 10, max_overflow=0
或任何你想要的组合,worker_connections
和pool_size+max_overflow
在线程之间共享,但进程不共享。
注意,一旦您添加了另一个实例或任何与DB对话的内容,它将使用那些宝贵的20个Postgres连接中的1个(或更多),因此您需要相应地进行调整。
https://serverfault.com/questions/1012203
复制相似问题