【问题标题】:What limits the performance of Apache configuration with lots of threads?是什么限制了具有大量线程的 Apache 配置的性能?
【发布时间】:2013-07-28 08:58:29
【问题描述】:

我们在 Linux 3.8 上使用 Apache 2.2 和 mod_wsgi 配置来测试它在高并发流量下的行为。我们使用 ApacheBench (v2.3) 从同一台机器创建流量。

我们的设置在 1000 个线程(10 个进程和 100 个线程)的情况下运行良好,但在尝试从那里扩展时遇到了问题。在 10000 个线程(10 个进程 1000 个线程)的情况下,服务器实际上变慢了,并且在相同数量的并发请求下开始执行非常糟糕。

大量 Apache 线程的性能限制因素是什么?为什么 10000 个线程的性能比 1000 个线程差?到底是什么限制了线程的数量?我们意识到,在通常的 Web 服务中,10000 个并发连接并不是日常业务,但我们正在努力更好地了解 Web 服务器的可扩展性和不同类型的 Web 服务器。

这是我们为 1000 个线程设置的 mpm 工作线程,效果非常好。

<IfModule mpm_worker_module>
    StartServers           10
    MinSpareThreads      1000
    MaxSpareThreads      1000
    ThreadLimit          1000
    ThreadsPerChild       100
    MaxClients           1000
    MaxRequestsPerChild     0
</IfModule>

Mpm 工作线程设置为 10000 个线程。此设置慢了 5 倍。

<IfModule mpm_worker_module>
    StartServers           10
    MinSpareThreads     10000
    MaxSpareThreads     10000
    ThreadLimit         10000
    ThreadsPerChild      1000
    MaxClients          10000
    MaxRequestsPerChild     0
</IfModule>

【问题讨论】:

    标签: apache mod-wsgi apachebench


    【解决方案1】:

    我什至不确定从哪里开始,为什么在 Apache 中使用这么多线程是个坏主意。我建议你先看看我的 PyCon 演讲:

    简短的回答是,如果您确实需要在单个服务器上处理大量真正并发的长时间运行的请求,那么您可能不应该使用 Apache。对于那些具有非标准要求的特定请求,您应该使用基于事件的(异步)系统。换句话说,您不需要将整个应用程序切换到异步模型,而是将您的应用程序垂直分区,并将具有与应用程序其余部分不同的要求的 URL 子集化。这样,您就可以根据每个人的要求定制托管,而不是强制您的整个应用程序在应用程序的一小部分施加的约束下运行。

    但实际上,大多数情况下,当人们认为他们需要能够在一台服务器上处理如此多的并发请求时,他们并没有。对于响应时间短的请求,每秒处理 10000 个请求,不需要 10000 个线程。这是因为在每 1 秒的时隙中,您可以处理超过 1 个请求。

    但是,可以搞砸的一件事是缓慢的客户端并保持活力。这是 Apache 的杀手锏。所以,把 nginx 作为代理放在它前面,并在 Apache 中关闭 keep alive,但在 nginx 中保持 keep alive 开启。使用 nginx 作为代理将 Apache 与慢速客户端隔离开来,并允许它以更少的资源更好地执行。这是因为只有当 Apache 通常拥有请求中的所有信息以便允许它立即处理请求时,才会将请求移交给 Apache。因此,它不会被捆绑并浪费资源等待慢速客户端。

    如果您确实对非常长时间运行的请求(长轮询)有要求,对于请求的子集,那么让 nginx 代理仅将这些 URL 代理到一个单独的基于异步的服务器。这样一来,您就不必处理在其他正常 Web 应用程序中使用异步系统的痛苦。

    说了这么多,还请记住,Web 服务器通常不会成为您的瓶颈。如果您的实际 Web 应用程序堆栈(包括数据库)每秒只能处理 10 个请求,谁会在乎服务器是否可以每秒处理 10000+ 个请求。这将是您真正的问题,如果您不提高 Web 应用程序的性能,那么调整 Web 服务器根本不会产生任何影响。唯一的解决方案是水平扩展并在它们之间拥有多个主机和负载平衡。

    为了找到真正的瓶颈,您需要对真实世界的应用程序进行性能监控,并使用来自真实用户的真实流量。您可以在我的演讲中了解有关性能监控的更多信息。

    【讨论】:

    • 您的回答很有教育意义,谢谢。希望那些 PyCon 链接很快就会上线。但。虽然我们的总体目标实际上是了解不同 Web 服务器类型的理论(您的回答对此有很大帮助),但通过这个 SO 问题,我们旨在了解基于线程的 Web 服务器中线程数量的限制。是物理内存吗?还是可能与上下文切换开销有关?
    • 链接应该已经可以工作了。对于 Python,取决于应用程序的限制是什么。可以是内存,可以是并发请求数,可以是线程中的 GIL 互斥量争用。很多因素都可以发挥作用。
    • @GrahamDumpleton 现在是 2021 年,您的链接已损坏。我希望你把这些谈话放在 youtube 上。如果可以的话,请分享一个新的链接。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2012-04-30
    • 2011-08-08
    • 2021-08-04
    • 2013-12-17
    • 2013-10-06
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多