如何选择要使用的Apache MPM?


261

这是有关选择正确的Apache httpd MPM 的规范问题

我对Apache提供的不同MPM之间有些困惑,例如'worker','event','prefork'等。

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


4
如果您支持mod_php,那么您正在做prefork。
Zoredache

6
@Zoredache :?她从没提到过PHP,即使有,mod_php也只能排除事件。还是您仍然坚持RL 8年前的言论?最近一次登录PHP的与Apache线程相关的错误是2005
。– symcbean 2012年

2
抱歉-必须投票解决这个问题-这里的问题太广泛了,无法回答。
symcbean 2012年

1
@symcbean回复:PHP和线程-这些天PHP的核心是线程安全的,但是您会发现人们正在编译的许多其他东西却不是。我在去年就被咬过,所以在很大程度上仍然是一个“测试(广泛地依赖它,然后再在生产中使用它”)……
voretaq7'4

根据所使用的操作系统,您甚至可能没有在标准安装中使用所有这些选项。
约翰·加迪尼尔

Answers:


415

有许多的MPM模块(多道处理模块),但迄今为止最广泛使用的(至少在* nix平台)是三种主要的:preforkworker,和event。从本质上讲,它们代表了Apache Web服务器的发展,以及服务器在其悠久的(以软件术语)历史上,在时间的计算限制内构建用于处理HTTP请求的不同方式。


prefork

mpm_prefork是..很好..它与所有东西兼容。它分拆了多个子进程来处理请求,并且子进程一次仅处理一个请求。因为服务器进程在那里坐着,可以立即采取行动,并且不需要处理线程封送处理,所以实际上它比更现代的线程MPM 更快,当您一次只处理一个请求时,但是并发请求会受到影响,因为让他们排队等待直到服务器进程可用。此外,尝试扩大prefork子进程的数量,您将很容易消耗掉一些严重的RAM。

除非您需要一个不是线程安全的模块,否则不建议使用prefork。

在以下情况下使用:您需要在使用线程时会中断的模块,例如mod_php。即使这样,也可以考虑使用FastCGI和php-fpm

在以下情况下不要使用:您的模块不会在线程中中断。

worker

mpm_worker使用线程-这对并发性有很大帮助。Worker剥离了一些子进程,这些子进程又剥离了子线程;与prefork相似,如果可能的话,一些备用线程将保持就绪状态,以为传入的连接提供服务。这种方法在RAM上要好得多,因为线程数不像prefork中的服务器数那样直接影响内存使用。它也更容易处理并发,因为连接只需要等待一个空闲线程(通常可用),而不是等待prefork中的备用服务器。

在以下情况下使用:使用的是Apache 2.2或2.4,并且主要运行SSL。

如果没有,请不要使用:除非您需要兼容性的预叉,否则您真的不会出错。

但是,请注意,踏板是连接到连接的,而不是请求的连接 -这意味着,保持活动连接始终保持线程的保持状态,直到关闭为止(这可能要花很长时间,具体取决于您的配置)。这就是为什么我们有..

event

mpm_event在结构上与工人非常相似;在Apache 2.4中,它刚刚从“实验”状态变为“稳定”状态。最大的区别在于,它使用专用线程来处理保持活动的连接,并且仅在实际发出请求时才将请求移交给子线程(允许这些线程在请求​​完成后立即释放备份)。这对于并发性客户端非常有用,这些并发性客户端不一定同时处于活动状态,而是偶尔发出请求,并且客户端的保持活动超时时间很长。

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

在以下情况下使用:如果使用的是Apache 2.4且喜欢线程,但是您不喜欢让线程等待空闲连接。每个人都喜欢线程!

如果没有,请不要使用:您不在Apache 2.4上,或者需要prefork以获得兼容性。


在当今的lololoris,AJAX和喜欢将6 TCP连接(当然还有保持活动)多路复用的浏览器中,并发是确保服务器扩展和扩展的重要因素。Apache的历史在这方面一直束手无策,尽管就资源使用或规模而言,它实际上仍未与nginx或lighttpd之类的东西相提并论,但很明显,开发团队正在努力构建仍然重要的Web服务器。在当今高要求并发的世界中。


3
-1:IME,worker仅将httpd占用空间减小了15%左右(IIRC Linux在RSS中报告了COW,这使得前叉看起来比使用的内存多得多)。进程的内核占用空间和NPTL线程之间的差异可以忽略不计。离毁灭地球还有很长的路要走。我不明白为什么您认为等待和分配线程比预定/分叉(预分叉)进程更有效地安排术语。您认为SSL总体上没有影响。
symcbean 2012年

9
@symcbean所以您是说15%的RAM使用率并不重要?很好,但是我的看法是相反的。并发性能要求不是我自己的。看这里。SSL的区别在事件MPM的文档中清楚地说明了: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

3
@ShaneMadden`,尽管在资源使用或规模方面,它实际上仍不能与nginx或lighttpd之类的东西相提并论。
凯莉·艾尔顿

关于SSL问题和事件MPM的@ShaneMadden:您知道nginx是否比apache更好地处理了此问题?
DASKAjA

看来,如果您在不了解mpm模块的情况下编译apache 2.4,它将附带名为事件mpm模块的模块,并且它可以与mod_php7一起使用(目前我正在研究mpm,因为apache2.4超出了mysql连接限制,而apache 2.2与同一个mysql服务器是不是)
BioHazard 16年

8

这是它如何与gif一起使用的很好的解释:

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

简要地说:如果您使用的是2.4,并且需要使用httpd作为反向代理(调度程序),那么您选择的是事件MPM


即使我们使用SSL?我在非SSL网站上使用apache作为代理和SSL启动器。
博肯

@bokan看起来不错,这是最好的,但是无论如何,SSL代理是有限的
Yura

哇〜博客文章比接受的答案好得多,而且gif太棒了!谢谢 你救了我的日子。
瑞克

6

截至2018年2月,用于事件MPM的Apache 2.4文档指出,使用Apache作为代理将阻止2.4.24以来的“改进的连接处理”正常工作。请参阅“ 限制”部分。

问题是,作为代理,工作人员无法确定响应的结尾在哪里,并且将被迫等待,直到看到整个响应,然后再将控制权返回给侦听器。

因此,似乎最好使用Worker模型作为apache的代理服务器。对于代理环境中的事件模型是否有优势,我并不是很清楚,但也许有。


5

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

如果没有任何偏好,我建议您使用OS发行版中的首选依赖项。例如,在安装Apache2时,默认情况下,Ubuntu将安装mpm-worker。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.