题 如何选择要使用的Apache MPM?


这是一个 典型问题 关于选择正确的Apache httpd MPM。

我对Apache提供的不同MPM - 'worker','event','prefork'等有点困惑。

它们之间有哪些主要区别,我如何确定哪一个最适合给定的部署?


243
2018-04-26 18:40




如果你支持mod_php,那么你正在做prefork。 - Zoredache
@Zoredache :?她从来没有提到PHP,即使她有,mod_php也只能排除事件。或者你仍然坚持8年前RL所做的评论?在PHP中记录的与线程apache相关的最后一个错误是在2005年。 - symcbean
对不起 - 得投票结束这个 - 这里的答案太宽泛了。 - symcbean
@symcbean Re:PHP和Threads - PHP的核心现在是线程安全的,但很多其他你会发现人们编译的东西却不是。我最近一直被咬过去,所以这是“在生产中依赖它之前的广泛测试”情况仍然...... - voretaq7
根据您使用的操作系统,您可能甚至没有标准安装提供的所有选项。 - John Gardeniers


答案:


有很多 MPM模块 (多处理模块),但到目前为止,使用最广泛的(至少在* nix平台上)是三个主要的: preforkworker,和 event。从本质上讲,它们代表了Apache Web服务器的发展,以及构建服务器的不同方式,以便在长时间(以软件术语)历史记录的时间计算约束内处理HTTP请求。


prefork

mpm_prefork 是......好吧......它与一切都兼容。它会循环使用许多子进程来提供请求,子进程一次只能处理一个请求。因为它有服务器进程坐在那里,准备采取行动,而不需要处理线程编组,它实际上是 快点 比起更现代的线程MPM,当你一次只处理一个请求时 - 但是并发请求会受到影响,因为它们会在服务器进程空闲之前排队等待。此外,尝试扩大prefork子进程的数量,你很容易吸收一些严重的RAM。

除非你需要一个非线程安全的模块,否则使用prefork可能是不可取的。

使用if: 你需要在使用线程时断开的模块,比如 mod_php。即便如此,考虑使用FastCGI和 php-fpm

不要使用if: 您的模块不会在线程中断。

worker

mpm_worker 使用线程 - 这对并发性有很大帮助。工作者将一些子进程旋转,这反过来又会剥离子线程;类似于prefork,如果可能的话,一些备用线程会保持就绪,以便为传入的连接提供服务。这种方法在RAM上更加友好,因为线程计数与内存使用没有直接关系,就像prefork中的服务器计数一样。它还更容易处理并发,因为连接只需要等待一个空闲线程(通常是可用的)而不是prefork中的备用服务器。

使用if: 您使用的是Apache 2.2或2.4,而您主要使用的是SSL。

不要使用if: 你真的不会出错,除非你需要prefork兼容性。

但是,请注意踏板是否附着 连接 并不是 要求  - 这意味着保持活动连接总是保持一个线程直到它关闭(这可能是很长一段时间,具体取决于您的配置)。这就是为什么我们有..

event

mpm_event 在结构上与工人非常相似;它刚刚在Apache 2.4中从“实验”状态转移到“稳定”状态。最大的区别在于它使用专用线程来处理保持活动的连接,并且只有在实际发出请求时才将请求发送到子线程(允许这些线程在请求​​完成后立即自由备份)。这对于一次不一定都是活动的客户端的并发性非常有用,但是偶尔会发出请求,并且当客户端可能具有长保持活动超时时。

这里的例外是SSL连接;在这种情况下,它的行为与worker相同(将给定的连接粘贴到给定的线程,直到连接关闭)。

使用if: 您使用的是Apache 2.4并且喜欢线程,但您不希望让线程等待空闲连接。每个人都喜欢线程!

不要使用if: 你不是在Apache 2.4上,或者你需要prefork兼容性。


在今天的世界里 slowloris,AJAX和浏览器喜欢将6个TCP连接(当然还有keep-alive)复用到服务器,并发性是使服务器扩展和扩展的重要因素。 Apache的历史在这方面已经把它降低了,虽然它在资源使用或规模方面仍然不能与nginx或lighttpd相提并论,但显然开发团队正在努力构建一个仍然相关的Web服务器在今天的高要求并发世界中。


396
2018-04-27 02:27



-1:IME,worker只会将httpd足迹的大小减少15%(IIRC Linux报告RSS中的COW,这使得前叉看起来好像它使用的内存比它多得多)。进程的内核占用空间与NPTL线程之间的差异可以忽略不计。距离惊天动地还有很长的路要走。我不明白为什么你认为等待和分配线程在调度术语方面比等待/调度(预分叉)进程更有效。也不是你认为SSL在整体上有什么影响。 - symcbean
@symcbean所以你说15%的RAM使用率并不重要?那没关系,但我的意见不然。并发性能声明不是我自己的。看到 这里。并且在MPM事件的文档中明确说明了SSL差异: The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection. - Shane Madden♦
@ShaneMadden`虽然它在资源使用或规模方面仍然没有达到像nginx或lighttpd这样的水平。我已经在这两个系统上都有了apache。 - Kelly Elton
@ShaneMadden关于SSL和事件MPM的问题:你知道nginx是否能比apache更好地处理这个问题? - DASKAjA
看来如果你在不知道mpm模块的情况下编译apache 2.4它会带有名为event mpm模块的模块,并且它与mod_php7一起使用(现在我正在研究mpm,因为apache2.4超出了mysql连接限制,而apache 2.2与相同的mysql服务器是不) - BioHazard


主要取决于您要使用的Apache模块。我认为worker通常是默认选择,但是一些(较旧的)模块需要分叉并依赖于prefork。

如果您没有首选项,我建议您使用操作系统发行版中的首选依赖项。例如,Ubuntu将在安装Apache2时默认安装mpm-worker。


5
2018-04-26 19:32





以下是对gif如何工作的一个很好的解释:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

简单地说:如果你在 2.4 你需要httpd作为 反向代理 (调度员)所以你的选择是 事件MPM


5
2018-06-21 13:10





截至2018年2月,Event MPM的Apache 2.4文档指出,使用Apache作为代理将保持自2.4.24以来“改进的连接处理”的设计工作。见 限制 部分。

问题在于,作为代理,工作人员无法分辨响应的结束位置,并且在将控制权返回给侦听器之前,将被迫等待直到看到整个响应。

出于这个原因,似乎使用Worker模型可能最适合将apache用作代理。我不清楚代理环境中的事件模型是否有优势,但也许有。


3
2018-02-14 15:01