我该如何调查SQLAlchemy QueuePool的限制溢出?

5

我收到了以下错误信息:

TimeoutError: 队列池大小为5,溢出10个已达上限,连接超时,超时时间为30

我看过了以下问题:

以及它们的答案。我尝试过它们,并且在非常简化的代码库中尝试重现我的问题,但我无法重现它。

我该怎么做才能找到/修复问题?

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

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

到目前为止,我还没有尝试设置app.config['SQLALCHEMY_POOL_RECYCLE'](要在此处设置here)。我猜我必须将其设置为一个较低的值以解决此问题,但那样可能会在其他地方导致超时,对吗?

1个回答

2
  1. 运行show PROCESSLIST以显示您的MySQL数据库的连接/池/使用情况。

    • 在PyCharm中,打开“Database”侧边栏(通常位于右侧),然后右键单击您的数据库/模式并选择“打开控制台”。粘贴上面的命令,然后单击绿色的“执行”按钮。
    • 我注意到当我使用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,多个用户是否可以同时使用网站(即使有长时间运行的查询)? - Martin Thoma
我的理解是,您的dev服务器将无法同时处理多个请求,但您的prod服务器应该使用像gunicornuWSGI这样的WSGI服务器,它将能够生成您的应用程序的多个实例。关于“您的生产应该使用WSGI服务器”的说明:我查看了Flask源代码,对于run()函数,它说“不要在生产设置中使用run()。 它不适用于生产服务器的安全性和性能要求。”您也可以在此处看到他们的说法:http://flask.pocoo.org/docs/0.12/deploying/ - Nathan Wailes
好的,但是我不使用app.run(请参见链接)。我使用WSGIServer。 - Martin Thoma
嗯...那我想我能提供的只有我的“如何调查问题”的技巧了。 - Nathan Wailes
为了保持这个问题的主题,我已经将我的答案中关于“我的情况”和“我是如何解决它的”部分移动到这个问题的答案中:https://dev59.com/fZnga4cB1Zd3GeqPbaPX#47151701 - Nathan Wailes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接