Apache Prefork vs Worker MPM
查看Apacheconfiguration文件,我看到了Prefork和Worker MPM的定义。 有什么区别,哪一个是Apache使用?
Prefork和Worker是MPM apache提供的两种types。 两者都有其优点和缺点。
默认情况下,mpm是线程安全的prefork。
Prefork MPM使用多个subprocess,每个进程使用一个线程,每个进程一次处理一个连接。
工人MPM使用多个subprocess,每个进程都有多个线程。 每个线程一次处理一个连接。
有关更多详细信息,请访问https://httpd.apache.org/docs/2.4/mpm.html和https://httpd.apache.org/docs/2.4/mod/prefork.html
Apache的多处理模块(MPM)负责绑定到机器上的networking端口,接受请求,并派遣孩子处理请求( http://httpd.apache.org/docs/2.2/mpm.html )。
它们就像任何其他Apache模块一样,除了只有一个MPM必须随时加载到服务器上 。 在configuration过程中selectMPM,并使用参数--with-mpm=NAME
和configure脚本将其编译到服务器中 ,其中NAME
是所需MPM的名称。
Apache将为每个操作系统使用默认的MPM,除非在编译时select不同的默认MPM(例如,在Windows mpm_winnt
默认使用mpm_winnt
)。 以下是操作系统及其默认MPM列表:
- BeOS
beos
- Netware
mpm_netware
- OS / 2
mpmt_os2
- Unix / Linux
prefork
( 针对Apache版本prefork
更新 :prefork
,worker
或event
,具体取决于平台function) - Windows
mpm_winnt
要检查哪些模块被编译到服务器中,使用命令行选项-l
( 这里是文档)。 例如在Windows安装中,您可能会得到如下所示的内容:
> httpd -l Compiled in modules: core.c mod_win32.c mpm_winnt.c http_core.c mod_so.c
从版本2.2开始,这是可用核心function和MPM模块的列表 :
-
core
– 始终可用的核心Apache HTTP服务器function -
mpm_common
– 一个由多个多处理模块(MPM)实现的指令集合, -
beos
– 这个多处理模块针对BeOS进行了优化。 -
event
– 标准工人MPM的实验变体 -
mpm_netware
多处理模块实现专门针对Novell NetWare优化的线程化Web服务器 -
mpmt_os2
用于OS / 2的混合多进程multithreadingMPM -
prefork
实现一个非线程的预分叉web服务器 -
mpm_winnt
– 此多处理模块针对Windows NT进行了优化。 -
worker
– 多处理模块,实现混合multithreading多进程Web服务器
现在,对prefork
和worker
之间的区别。
prefork
MPM
实现了一个非线程化的预分叉web服务器,以类似于Apache 1.3的方式处理请求。 对于需要避免与非线程安全库兼容的线程的站点来说,这是适当的。 它也是隔离每个请求的最好的MPM,所以单个请求的问题不会影响任何其他请求。
worker
MPM实现一个混合的多进程multithreading服务器,并提供更好的性能,因此它应该是首选的,除非使用包含非线程安全库的其他模块(另请参阅此讨论或在Serverfault上)。
看看这个更多的细节。 它指的是Apache如何处理多个请求。 默认情况下,Preforking启动了许多Apache进程(这里默认是2个,不过我相信可以通过httpd.confconfiguration)。 工作人员MPM将为每个请求启动一个新的线程,我猜想,这是更高效的内存。 从历史上看,Apache已经使用了prefork,所以它是一个更好的testing模型。 线程仅在2.0中添加。
对于CentOS 6.x和7.x(包括Amazon Linux),请使用:
sudo httpd -V
这将显示您configuration了哪些MPM。 无论是prefork,工人还是事件。 Prefork是较早的线程安全模型。 Worker是multithreading的,事件支持php-mpm,这应该是一个更好的处理线程和请求的系统。
但是,根据configuration,您的结果可能会有所不同。 我在php-mpm中看到了很多不稳定的情况,而且速度没有提高。 一个咄咄逼人的蜘蛛可以很容易地耗尽php-mpm中的最大subprocess。
prefork,worker或event的设置在sudo nano /etc/httpd/conf.modules.d/00-mpm.conf(CentOS 6.x / 7.x / Apache 2.4)中设置。
# Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html #LoadModule mpm_event_module modules/mod_mpm_event.so
您可以通过发出以下命令来判断Apache是使用瓶坯还是工人
apache2ctl -l
在结果输出中,查找prefork.c或worker.c的提及