设为首页 收藏本站
查看: 511|回复: 0

[经验分享] Apache下三种MPM模式:prefork,worker和event

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-8-9 10:32:27 | 显示全部楼层 |阅读模式
MPM(Multi-Processing Module,多进程处理模块):
prefork,worker和event

查看Apache的模式,可以使用httpd -V命令来查看:
/usr/local/apache2/bin/httpd  -VServer version: Apache/2.2.29 (Unix)Server built:   Aug 20 2015 20:11:21Server's Module Magic Number: 20051115:36Server loaded:  APR 1.5.1, APR-Util 1.5.3Compiled using: APR 1.5.1, APR-Util 1.5.3Architecture:   64-bitServer MPM:     Prefork  threaded:     no    forked:     yes (variable process count)
编译的时候,通过configure的参数来指定
--with-mpm=prefork|worker|event

cat /usr/local/apache2/build/config.nice"./configure" \..."--with-apr=/usr/local/apr" \"--with-apr-util=/usr/local/apr-util" \"--with-z=/usr/local" \"--with-mpm=prefork" \....
可以编译为三种都支持,通过修改配置来更换
--enable-mpms-shared=all

modules目录下,会自动编译出三个MPM的so文件,
在httpd.conf中,修改加载的模块来改变MPM的模式:
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

prefork
"It's probably not advisable to use prefork unless you need a module that's not thread safe."
prefork模式,很古老,非常稳定的模式,不建议使用的模式,除非是在使用一个非线程安全的模块。

为了减少频繁创建和销毁进程的开销,Apache在启动之初,预先fork一些子进程,然后等待请求进来。

每个子进程只有一个线程,在一个时间点内,只能处理一个请求。

优点:成熟稳定,兼容所有新老模块。
MOD_PHP拓展不需要支持线程安全,不需要担心线程安全的问题。

缺点:一个进程相对占用更多的系统资源,消耗更多的内存。
不擅长处理高并发请求,高并发场景下会将请求放进队列中,
一直等到有可用进程,请求才会被处理。

使用场景:
尽量不推荐在此模式下裕兴,除非模块无法在线程模式下运行。
PHP在非线程安全模下,推荐使用FastCGI和php-fpm模式。


worker

线程模式,内存占用会少一些,在高并发方面表现的会更好。

启动时会fork几个子进程,每个子进程创建一些线程,同时包括一个监听线程。

每个请求过来,会被分配到1个线程来服务。
线程比起进程会更轻量,线程通常会共享父进程的内存空间。
在高并发的场景下,比prefork有更多的可用线程,性能表现会更优秀一些。

如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了。
为了防止这场异常场景出现,就需要使用多个进程再加多线程,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。

优点:占据更少的内存,高并发下表现更优秀。

缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。
keep-alive的长连接方式,是为了让下一次的socket通信复用之前创建的连接,从而,减少连接的创建和销毁的系统开销。保持连接,会让某个进程或者线程一直处于等待状态,即使没有数据过来。如果使用keep-alive的长连接方式,某个线程会一直被占据,需要一直等待到超时才会被释放。

使用场景:
使用Apache httpd 2.2或2.4版本,同时打算运行SSL服务。
除非兼容性问题解决不了,一般比较推荐worker模式。

event


"it's just been moved from 'experimental' to 'stable' status in Apache 2.4."
event MPM,需要Linux系统(Linux 2.6+)对EPoll的支持,同时建议在httpd 2.4.x版本下使用。
event 和worker模式很像,解决了keep-alive场景下,长期被占用的线程的资源浪费问题。
event MPM中,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放,增强了高并发场景下的请求处理能力。
event MPM在遇到某些不兼容的模块时会失效,将会回退到worker模式,一个工作线程处理一个请求。


使用场景:
使用apache httpd 2.4,同时使用到多线程,event是最佳的运行模式。

httpd 2.2.x文档下:
Warning
This MPM is experimental, so it may or may not work as expected.
This MPM does not perform well on older platforms which lack good threading, but the requirement for EPoll or KQueue makes this moot.
To use this MPM on FreeBSD, FreeBSD 5.3 or higher is recommended. However, it is possible to run this MPM on FreeBSD 5.2.1, if you use libkse (see man libmap.conf).
For NetBSD, at least version 2.0 is recommended.
For Linux, a 2.6 kernel is recommended. It is also necessary to ensure that your version of glibc has been compiled with support for EPoll.



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-255279-1-1.html 上篇帖子: 普通用户编译安装 httpd-2.4.23 下篇帖子: Apache支持.htaccess以及“No input file specified”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表