这是一个关于选择正确的Apache httpd MPM的规范性问题。
我对Apache提供的不同MPM有点困惑-'worker','event' ,“ prefork”等。
它们之间的主要区别是什么,我如何确定哪一个最适合给定部署?
#1 楼
有许多MPM模块(多处理模块),但到目前为止使用最广泛的模块(至少在* nix平台上)是三个主要模块:prefork
,worker
和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来实现兼容性。 (当然,对于保持活动状态的服务器),并发是确保服务器扩展和扩展的重要因素。 Apache的历史在这方面一直束手无策,尽管就资源使用或规模而言,它实际上仍未与nginx或lighttpd之类的东西相提并论,但很明显,开发团队正在努力构建仍与之相关的Web服务器。在当今高要求并发的世界中。
评论
-1:IME,worker仅将httpd占用空间减少了15%左右(IIRC Linux报告RSS中的COW,这使得前叉看起来好像比使用的内存多得多)。进程的内核占用空间和NPTL线程之间的差异可以忽略不计。离毁灭地球还有很长的路要走。我不明白为什么您认为等待和分配线程比预定/分叉(预分叉)进程更有效地安排术语。您认为SSL总体上没有影响。
–symcbean
2012年4月27日在8:28
@symcbean所以您是说15%的RAM使用率并不重要?很好,但是我的看法是相反的。并发性能要求不是我自己的。看这里。 SSL的区别在事件MPM的文档中清楚地说明:改进的连接处理尚不适用于某些连接筛选器,尤其是SSL。对于SSL连接,此MPM将退回到工作程序MPM的行为,并为每个连接保留一个工作程序线程。
– Shane Madden
2012年4月27日在16:23
@ShaneMadden`,尽管在资源使用或规模方面确实还不能与nginx或lighttpd之类的东西相提并论,但是我在这两个系统上都达到了最低限度。
–凯利·埃尔顿(Kelly Elton)
2012年7月5日在17:05
@ShaneMadden关于SSL和事件MPM的问题:您是否知道nginx处理此问题是否比apache更好?
– DASKAjA
13年7月2日在9:37
使用SSL连接时事件MPM的限制似乎不再成立。手册httpd.apache.org/docs/2.4/mod/event.html现在说:“这些改进对两个HTTP / HTTPS连接均有效。”因此,在Apache 2.4上,事件似乎总是可取的,而worker仍在2.2倍以上。
– Peter Thomassen
17年8月25日在15:43
#2 楼
这是如何与gifs一起使用的很好的解释:https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/
简要地说:如果您使用2.4,并且需要使用httpd作为反向代理(调度程序),那么您选择的是事件MPM
评论
即使我们使用SSL?我在非SSL网站上使用apache作为代理和SSL启动器。
– bokan
19年1月14日在15:12
@bokan看起来是的,这是最好的,但是无论如何,对于SSL代理是有限的
–尤拉
19年1月16日在12:31
哇〜博客文章比接受的答案好得多,而且gif太棒了!谢谢你救了我的日子。
–里克
19年6月8日在10:18
#3 楼
截至2018年2月,用于事件MPM的Apache 2.4文档指出,使用Apache作为代理将阻止2.4.24以来的“改进的连接处理”正常工作。请参阅“限制”部分。问题是,作为代理,工作人员无法知道响应的结尾在哪里,并且将被迫等待,直到看到整个响应,然后再将控制权返回给侦听器。 />
出于这个原因,似乎当使用Apache作为代理时,最好使用Worker模型。对于代理环境中的事件模型是否有优势,我并不是很清楚,但也许有。
#4 楼
通常取决于要使用的Apache模块。我认为通常是worker的默认选择,但是某些(较旧的)模块需要分叉并且依赖于prefork。如果没有偏好,建议您从OS发行版中选择首选的依赖项。例如,在安装Apache2时,默认情况下,Ubuntu将安装mpm-worker。
评论
如果您支持mod_php,那么您正在做前叉。@Zoredache :?她从来没有提到过PHP,即使有,mod_php也只能排除事件。还是您仍然坚持RL 8年前的言论? PHP中最后一次与线程apache相关的错误是2005年。
抱歉-必须投票解决这个问题-这里的问题太广泛了。
@symcbean回复:PHP和线程-目前,PHP的核心是线程安全的,但您会发现人们正在编译的许多其他东西并不是。我在去年就被咬过,所以在很大程度上仍然是“(在生产中依赖它之前的测试)”。
根据所使用的操作系统,您甚至可能没有在标准安装中使用所有这些选项。