gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:03:06 25 4
gpt4 key购买 nike

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

根本原因很可能是应用程序性能不佳,但在现阶段,我们无法承担更多的开发时间,因此我正在寻找一种廉价的部署配置黑客来缓解该问题。

  • 数据提供商正在以高速率发送数据。我相信他们的程序会收到很多 503 并且只需尝试/捕获这些来重试,直到成功。

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

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

<小时/>

我确定了 mod_limitipconn这似乎是为此定制的。

mod_limitipconn [...] allows administrators to limit the number of simultaneous requests permitted from a single IP address.

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

由于 WSGI 设置,我一直认为最多有 5 个同时连接:threads=5。但我读过Processes and Threading在 mod_wsgi 文档中,我很困惑。

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

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

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

  • 当处理 5 个请求时,如果有第六个请求到达,客户端会收到 503

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

  • 增加 WSGI 配置中的线程数量可以通过提供更精细的速率限制来帮助在客户端之间共享连接池(您可以将 4 个提供程序中的每一个限制为 3 个,并保留另外 5 个,总共 17 个) )但不会提高整体性能,即使服务器有空闲核心,因为 the Python GIL prevents several threads to run at the same time .

  • 将线程数提高到 100 等较高数字可能会使请求更长,但会限制 503 响应。如果客户端将自己的并发请求限制设置得不太高,这甚至可能就足够了,如果他们不这样做,我可以使用 mod_limitipconn 之类的东西强制执行。

  • 过多增加线程数会使请求过长,导致客户端超时,而不是 503,这并不是更好。

<小时/>

当前配置如下。不确定什么重要。

apachectl -V:

Server version: Apache/2.4.25 (Debian)
Server built: 2018-06-02T08:01:13
Server's Module Magic Number: 20120211:68
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)

/etc/apache2/apache2.conf:

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

/etc/apache2/mods-available/mpm_worker.conf(但这在事件中应该不重要,对吧?):

<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>

/etc/apache2/sites-available/my_app.conf:

WSGIDaemonProcess my_app threads=5

最佳答案

我希望他们不要被打扰,因此将数据提供者的请求与数据消费者分开(我不熟悉 apache,所以我不会向您展示生产就绪的配置,而是向您展示总体方法):

<VirtualHost *>
ServerName example.com

WSGIDaemonProcess consumers user=user1 group=group1 threads=5
WSGIDaemonProcess providers user=user1 group=group1 threads=5
WSGIScriptAliasMatch ^/consumers_ulrs/.* /path_to_your_app/consumers.wsgi process-group=consumers
WSGIScriptAliasMatch ^/providers_ulrs/.* /path_to_your_app/providers.wsgi process-group=providers

...

</VirtualHost>

通过限制每个 IP 的请求量可能会损害用户体验,但仍然无法解决问题。例如,请注意,由于 NAT 和 ISP 的工作方式,许多独立用户可能拥有相同的 IP。

附注很奇怪的是 ThreadsPerChild=25 而是 WSGIDaemonProcess my_appthreads=5。您确定使用该配置,Apache 创建的所有线程都会被 WSGI 服务器使用吗?

关于python - 在 WSGI/apache 应用程序中强制执行每个 IP 的并发线程限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com