猿问

在 WSGI/apache 应用程序中强制执行每个 IP 的并发线程限制

我们正在运行一个 Flask 应用程序来公开存储在数据库中的数据。它返回很多503错误。我的理解是,当达到最大并发线程数时,这些是由 apache 生成的。

根本原因很可能是应用程序性能不佳,但在这个阶段,我们无法承受更多的开发时间,所以我正在寻找一种廉价的部署配置技巧来缓解这个问题。

  • 数据提供者正在以高速率发送数据。我相信他们的程序得到了很多,503只是尝试/抓住那些重试直到成功。

  • 数据消费者以低得多的速度使用该应用程序,我希望他们不要被这些问题所困扰。

我正在考虑限制来自每个提供商的 IP 的并发访问数量。他们可能会获得较低的吞吐量,但他们会像以前一样忍受它,这将使休闲消费者的生活更轻松。


我确定了似乎为此而定制的mod_limitipconn

mod_limitipconn [...] 允许管理员限制来自单个 IP 地址的同时请求的数量。

我想确定我了解它是如何工作的以及如何设置限制的。

由于 WSGI 设置,我一直认为最多有 5 个同时连接:threads=5. 但是我在 mod_wsgi 文档中阅读了进程和线程,我很困惑。

考虑到下面的配置,这些假设是否正确?

  • 一次仅运行一个应用程序实例。

  • 最多可以产生 5 个并发线程。

  • 当处理 5 个请求时,如果第 6 个请求到达,客户端会得到一个503.

  • 将 apache 级别对 IP xxxx 的同时请求数量限制为 3 将确保该 IP 只能使用这 5 个线程中的 3 个,将 2 个留给其他 IP。

  • 增加 WSGI 配置中的线程数可以通过提供更细粒度的速率限制来帮助在客户端之间共享连接池(您可以将 4 个提供者中的每一个限制为 3 个,并保持 5 个,总共 17 个),但不会改善整体性能,即使服务器有空闲内核,因为Python GIL 阻止多个线程同时运行

  • 将线程数提高到 100 之类的高数可能会使请求更长,但会限制503响应。如果客户端将自己的并发请求限制设置得不太高,甚至可能就足够了,如果没有,我可以使用类似mod_limitipconn.

  • 过多地增加线程数会使请求变得很长,以至于客户端会超时,而不是503这样并不是更好。



富国沪深
浏览 271回答 2
2回答

元芳怎么了

我希望他们不要被数据消费者的数据提供者的请求所困扰(我不熟悉 apache,所以我没有向您展示生产就绪的配置,而是一种整体方法):<VirtualHost *>&nbsp; &nbsp; ServerName example.com&nbsp; &nbsp; WSGIDaemonProcess consumers user=user1 group=group1 threads=5&nbsp; &nbsp; WSGIDaemonProcess providers user=user1 group=group1 threads=5&nbsp; &nbsp; WSGIScriptAliasMatch ^/consumers_ulrs/.* /path_to_your_app/consumers.wsgi process-group=consumers&nbsp; &nbsp; WSGIScriptAliasMatch ^/providers_ulrs/.* /path_to_your_app/providers.wsgi process-group=providers&nbsp; &nbsp; ...</VirtualHost>通过限制每个 IP 的请求数量,您可能会损害用户体验,但仍然无法解决您的问题。例如,请注意由于 NAT 和 ISP 的工作方式,许多独立用户可能具有相同的 IP。PS 这很奇怪,ThreadsPerChild=25但是WSGIDaemonProcess my_app threads=5. 您确定使用该配置 Apache 创建的所有线程都将被 WSGI 服务器使用吗?
随时随地看视频慕课网APP

相关分类

Python
我要回答