如何调查 SQLAlchemy QueuePool 限制溢出?
Posted
技术标签:
【中文标题】如何调查 SQLAlchemy QueuePool 限制溢出?【英文标题】:How can I investigate SQLAlchemy QueuePool limit overflow? 【发布时间】:2018-04-14 14:41:29 【问题描述】:我明白了
TimeoutError: QueuePool limit of size 5 overflow 10达到,连接超时,超时30
我已经看到了问题:
Sql Alchemy QueuePool limit overflow SQLAlchemy raises QueuePool limit of size 10 overflow 10 reached, connection timed out after some time以及他们的答案。我尝试了它们,并尝试在very simplified codebase 中重现我的问题。我无法重现它。
我该怎么做才能找到/解决问题?
例如,我可以在 Python 中获取 QueuePool 的当前“使用情况”吗?
(另外,但可能更好的另一个问题:为什么我不应该将队列溢出设置为-1?)
到目前为止我没有尝试的是设置app.config['SQLALCHEMY_POOL_RECYCLE']
(将设置为here)。我想我必须将它设置为一个较低的值才能解决这个问题,但我可能会在其他地方超时,对吧?
【问题讨论】:
【参考方案1】:对您的 mysql 数据库运行 show PROCESSLIST
以显示连接/池/使用情况。
TimeoutError: QueuePool limit of size 10 overflow 10 reached
(10 + 10 = 20)。
当我摆脱 threaded=True
后,我只看到一个连接打开。
提交或存储所有现有更改,然后创建一个分支并开始剥离代码/逐个简化您的应用程序并查看问题是否仍然弹出。
在这种情况下我没有使用此技术,但在处理其他此类严重难以追踪的错误时,我已成功使用它。 由于您提到无法通过一个简单的示例重现该问题,我认为值得推荐这种技术作为获得最小示例的一种方式。(结合#2)尝试减少SQLALCHEMY_POOL_SIZE
Flask-SQLAlchemy 设置,以便更快地重现错误。
【讨论】:
嗯,我明天去看看。如果您没有threaded=True
,那么多个用户是否可以同时使用该网站(即使有长时间运行的查询)?
我的理解是您的 dev 服务器将无法同时处理多个请求,但您的 prod 服务器应该使用 WSGI 服务器比如gunicorn
或uWSGI
,它们将能够生成您的应用程序的多个实例。详细说明“您的产品应该使用 WSGI 服务器”:我查看了 Flask 源代码,对于 run()
函数,它说“不要在生产环境中使用 run()
。它不是为了满足安全性和生产服务器的性能要求。”你也可以在这里看到他们这样说:flask.pocoo.org/docs/0.12/deploying
好的,但我不使用 app.run 反正(见链接)。我使用 WSGIServer
嗯...那么我想我能提供的只有“如何调查问题”的提示。
为了保持这个问题的主题,我已经移动了我对这个问题的回答中的“我的情况”和“我如何解决它”部分:***.com/a/47151701/4115031以上是关于如何调查 SQLAlchemy QueuePool 限制溢出?的主要内容,如果未能解决你的问题,请参考以下文章
TimeoutError: QueuePool 大小为 5 的限制溢出 10,连接超时,超时 30
SQLAlchemy 可以对数据库进行非破坏性更改,将当前模型与数据库模式进行比较吗?
如何自动填充 SQLAlchemy 数据库字段? (Flask-SQLAlchemy)