当前位置: 首页 > 知识库问答 >
问题:

选择DBpool_size用于运行在GUnicorn上的Flask-SQLAlChemy应用程序

胡飞舟
2023-03-14

我有一个运行在Gunicorn中的Flask SQLAlchmey应用程序连接到PostgreSQL数据库,我很难确定pool\u size值应该是多少,以及我应该期望多少个数据库连接。

这是我对事物运作方式的理解:

  • Python 3.7中的进程不共享内存

到目前为止这是正确的吗?如果这是正确的,那么对于在Gunicorn中运行的同步烧瓶应用程序:

  • 最大数据库连接数=(工作线程数)*(每个工作线程数)?
  • 在一个worker中,它是否会比其他worker使用更多的池连接

pool_size应该大于线程数的原因是什么?那么,对于一个用Gunicorn--works=5--thread=2 main启动的Gunicorn应用程序:应用程序应该pool_size是2吗?如果我只使用辅助角色,而不使用线程,是否有任何理由使pool_size大于1?

共有3个答案

夹谷成龙
2023-03-14

我得说你的理解力很好。单个WSGI工作线程中的线程确实将共享一个连接池;因此,理论上,数据库连接的最大数量是(工作者数量)*N,其中N=pool\u size max\u overflow。(我不确定Flask SQLAlchemy将max_overflow设置为什么,但这是这里等式的一个重要部分-请参阅QueuePool文档了解其含义。)

在实践中,如果您只使用Flask-SQLAlChemy提供给您的线程范围的会话,那么每个线程最多只能有一个连接;因此,如果您的线程数小于N,那么您的上限将确实是(工人数)*(每个工人的线程数)

长孙昀
2023-03-14

加上我的2美分。您的理解是正确的,但有一些想法需要考虑:

>

  • 如果您的应用程序是IO绑定的(例如与数据库对话),那么您确实希望有多个线程。否则,您的CPU将永远无法达到100%的利用率。您需要测试线程的数量以获得正确的数量,通常使用负载测试工具并比较每秒请求数和CPU利用率。

    考虑到辅助角色数量和连接之间的关系,您可以看到,当更改辅助角色数量时,您需要调整最大池大小。这可能很容易忘记,所以也许一个好主意是将池大小设置在工作人员数量以上一点,例如该数量的两倍。

    postgresql为每个连接创建一个进程,当您有很多gunicorn进程时,可能无法很好地扩展。我会选择一些连接池,它位于你的应用程序和数据库之间(我想pgbouncer是最流行的)。

  • 贺轶
    2023-03-14

    只是在@matino的回答中加入了我自己最近的一些经历。WSGI应用程序也可以受益于异步辅助程序。我将在这里添加一些关于异步工作者连接池的内容。

    我们最近在生产中遇到了一些类似的问题。我们的交通量在1-2天内猛增,由于某种原因,所有的请求都被阻塞了。我们将gunicorn与gevent异步工作者一起用于我们的django应用程序。事实证明,psql连接是许多请求停止(并最终超时)的原因。

    建议的并发请求数为(2*CPU)1。因此,在同步场景中,您的计算如下:(workers\u num*threads\u num)

    你会得到(workers_num*threads_num)最大连接到你的数据库。因此,您需要将您的psqlpool_size设置为大于此数字的值。但是当你使用异步辅助角色时,计算会有点不同。看看这个Gunicorn命令:

    gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 django:app
    

    在这种情况下,并发请求的最大数量可以达到3000个请求。因此,您需要将池大小设置为大于3000的值。如果应用程序是IO绑定的,那么使用异步工作程序将获得更好的性能。这样,您将能够更有效地利用您的CPU。

    关于连接池,当您使用像PgBouncer这样的解决方案时,您就摆脱了一直打开和关闭连接的开销。因此,它不会影响您设置池大小的决定。在交通流量较低的情况下,其影响可能不明显,但这对于处理较高的交通流量是必要的。

     类似资料:
    • 问题内容: 我一直在为我的应用程序使用nginx / gunicorn和Flask开发新的开发平台。 运维方面,一切正常-我遇到的问题是调试Flask层。当我的代码中有错误时,我只是直接向浏览器返回了500错误,而控制台或日志中没有任何显示。 我已经尝试了许多不同的配置/选项。我想我肯定缺少明显的东西。 我的gunicorn.conf: 乏味的一些Flask代码示例-testserver.py:

    • 问题内容: 我是新来的,仅使用nginx提供静态文件。我现在已经安装了flask and gunicorn。如果我运行,然后从服务器中获取它,它将运行良好。但是,如果尝试从浏览器访问它,它将返回404错误(我正在托管位于root用户的wordpress网站的服务器上运行此错误)。 Flask应用程序: 以及我的nginx配置的相关部分: 我希望这是所有相关信息。如果没有,请告诉。谢谢! 问题答案:

    • 我想用Docker中的gunicorn运行Flask web服务应用程序。启动后,应用程序加载一个大型机器学习模型。 然而,当我在Docker中运行gunicorn时,我收到了以下超时,它只是不断地繁殖工人。 在Docker中将其作为烧瓶应用程序运行或从命令行运行带有(或不带有)Gunicorn的烧瓶应用程序都可以正常工作。如果我删除机器学习模型,它也适用于Gunicorn。 例如: 这是我与Fl

    • 问题内容: 我有一个现有的Flask应用程序,并且想找到通往另一个应用程序的路线。更具体地说,第二个应用程序是Plotly Dash应用程序。如何在现有的Flask应用程序中运行Dash应用程序? 我还尝试将路由添加到Dash实例,因为它是Flask应用程序,但出现错误: 问题答案: 从文档: 基本的Flask应用程序可从访问app.server。 你还可以将自己的Flask应用实例传递到Dash

    • 问题内容: 我有用Flask编写的Web应用程序。正如每个人的建议,我不能在生产中使用Flask。所以我想到了带有Flask的Gunicorn。 在Flask应用程序中,我正在加载一些机器学习模型。这些总大小为8GB。我的Web应用程序的并发性可以达到1000个请求。并且机器的RAM是15GB。 那么,运行此应用程序的最佳方法是什么? 问题答案: 你可以使用Gunicorn的多个工作人员或异步工作

    • 如何在SQLAlchemy中执行原始SQL? 我有一个在flask上运行的python web应用程序,它通过SQLAlchemy与数据库接口。 我需要一种方法来运行原始SQL。查询涉及多个表连接以及内联视图。 我试过: 但我总是会遇到网关错误。