是什么限制了具有大量线程的Apache配置的性能?

是什么限制了具有大量线程的Apache配置的性能?,apache,mod-wsgi,apachebench,Apache,Mod Wsgi,Apachebench,我们在Linux 3.8上使用Apache2.2和mod_wsgi配置来测试其在高并发流量下的行为。我们使用ApacheBench(v2.3)从同一台机器创建流量 我们使用1000个线程(10个进程,100个线程)进行了很好的设置,但是在尝试从那里扩展时遇到了问题。在10000个线程(10个进程1000个线程)的情况下,服务器实际上变慢了,并且在相同数量的并发请求下开始执行非常糟糕的操作 大量Apache线程的性能限制因素是什么?为什么10000个线程的性能比1000个线程差?到底是什么限制了线

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

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

大量Apache线程的性能限制因素是什么?为什么10000个线程的性能比1000个线程差?到底是什么限制了线程的数量?我们意识到,在通常的web服务上,10000个并发连接不是日常事务,但我们正试图更好地理解web服务器的可伸缩性和不同类型的web服务器

这是我们为1000个线程设置的mpm worker,它运行得非常好

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

StartServers 10
Minspare1000
MaxSpareThreads 1000
线程限制1000
螺纹圆钢100
MaxClients 1000
MaxRequestsPerChild 0
10000个线程的Mpm工作线程设置。此设置速度慢了5倍

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

StartServers 10
MinSpareThreads 10000
MaxSpareThreads 10000
线程限制10000
螺纹帕尔希尔德1000
MaxClients 10000
MaxRequestsPerChild 0

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

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

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

但有一件事会把事情搞砸,那就是慢客户机和保持活力。这是Apache的杀手。因此,将nginx作为代理放在它前面,并在Apache中关闭keep-alive,但在nginx中保持keep-alive。使用nginx作为代理将把Apache与慢速客户端隔离开来,并允许它以更少的资源执行更好的操作。这是因为只有当请求通常包含请求中的所有信息时,才会将请求传递给Apache,以便允许它立即处理该请求。因此,is不会被占用,也不会浪费资源等待速度较慢的客户机

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

尽管如此,还请记住,web服务器通常不会成为您的瓶颈。如果您的实际web应用程序堆栈(包括数据库)每秒只能处理10个请求,谁会在乎服务器是否能够每秒处理10000多个请求呢。这将是您真正的问题,如果您不提高web应用程序的性能,调整web服务器将毫无意义。唯一的解决方案是横向扩展,并在它们之间具有多个主机和负载平衡


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

您的回答很有教育意义,谢谢。希望那些PyCon链接能很快建立起来。但是虽然我们的总体目标实际上是理解不同web服务器类型的理论(您的回答对这一点很有帮助),但通过这个问题,我们的目标是理解基于线程的web服务器中线程数量的限制。是物理内存吗?或者可能与上下文切换开销有关?链接应该已经起作用了。对于Python,取决于应用程序的限制是什么。可以是内存,可以是并发请求的数量,可以是线程中的GIL互斥争用。很多因素都会起作用。@GrahamDumpleton现在是2021年,你的联系被切断了。我希望你能把那些演讲放到youtube上。如果可以,请分享一个新链接。谢谢