【问题标题】:How can I investigate SQLAlchemy QueuePool limit overflow?如何调查 SQLAlchemy QueuePool 限制溢出?
【发布时间】:2018-04-14 14:41:29
【问题描述】:

我明白了

TimeoutError: QueuePool limit of size 5 overflow 10达到,连接超时,超时30

我已经看到了问题:

以及他们的答案。我尝试了它们,并尝试在very simplified codebase 中重现我的问题。我无法重现它。

我该怎么做才能找到/解决问题?

例如,我可以在 Python 中获取 QueuePool 的当前“使用情况”吗?

(另外,但可能更好的另一个问题:为什么我不应该将队列溢出设置为-1?)

到目前为止我没有尝试的是设置app.config['SQLALCHEMY_POOL_RECYCLE'](将设置为here)。我想我必须将它设置为一个较低的值才能解决这个问题,但我可能会在其他地方超时,对吧?

【问题讨论】:

    标签: python mysql flask sqlalchemy flask-sqlalchemy


    【解决方案1】:
    1. 对您的 MySQL 数据库运行 show PROCESSLIST 以显示连接/池/使用情况。

      • 在 PyCharm 中,打开“数据库”侧边栏(通常在右侧),然后右键单击您的数据库/架构并选择“打开控制台”。粘贴上面的命令,然后点击绿色的“执行”按钮。
      • 我注意到的是,当我使用 API 时,每个 API 调用都会打开一个单独的连接,当它们达到 20 个连接时,下一个 API 调用会导致错误,即 TimeoutError: QueuePool limit of size 10 overflow 10 reached (10 + 10 = 20)。
      • 当我摆脱 threaded=True 后,我只看到一个连接打开。
    2. 提交或存储所有现有更改,然后创建一个分支并开始剥离代码/逐个简化您的应用程序并查看问题是否仍然弹出。

      • 在这种情况下我没有使用此技术,但在处理其他此类严重难以追踪的错误时,我已成功使用它。
      • 由于您提到无法通过一个简单的示例重现该问题,我认为值得推荐这种技术作为获得最小示例的一种方式。
    3. (结合#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
    • 嗯...那么我想我能提供的只有“如何调查问题”的提示。
    • 为了保持这个问题的主题,我已经移动了我对这个问题的回答中的“我的情况”和“我如何解决它”部分:stackoverflow.com/a/47151701/4115031
    猜你喜欢
    • 2014-09-17
    • 2016-11-12
    • 2021-12-31
    • 2016-12-13
    • 2021-08-22
    • 2016-09-29
    • 2020-02-20
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多