如何调查 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 以显示连接/池/使用情况。

    在 PyCharm 中,打开“数据库”侧边栏(通常在右侧),然后右键单击您的数据库/架构并选择“打开控制台”。粘贴上面的命令,然后点击绿色的“执行”按钮。 我注意到的是,当我使用 API 时,每个 API 调用都会打开一个单独的连接,当它们达到 20 个连接时,下一个 API 调用会导致错误,即 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 服务器比如gunicornuWSGI,它们将能够生成您的应用程序的多个实例。详细说明“您的产品应该使用 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)

如何禁用SQLAlchemy缓存?

如何在 SQLAlchemy 模型中使用 SQLAlchemy Utils

如何级联删除一对多数据 sqlalchemy