解析 Apache 的三种 MPM 工作模式
Posted 研发云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析 Apache 的三种 MPM 工作模式相关的知识,希望对你有一定的参考价值。
作为颇具统治力的 Web 应用中间件
Apache 的诸多特点属性早已为人所熟知
例如 MPM(多重处理模块)
就是它的核心组件之一
Apache 通过 MPM 来使用操作系统的资源
并对进程和线程池进行管理
而 MPM 目前主要有三种工作模式
从最早期的 Prefork,到后来的 Worker
再到最新的 Event
工作模式的变化也代表着 Apache
为了适应服务需求所做出的自我调整
Prefork 模式为多进程方式
该模式会为每个请求起一个进程响应
是 Unix 平台上默认的(缺省)模式
Worker 模式为多线程方式
每个线程响应一个请求
Event 基于异步 I/O 模型
每个进程或线程响应多个用户请求
如果 Apache 已经安装
可以用 "httpd -I" 或者 "httpd -V" 命令
来查看当前的工作模式
若 Server MPM 显示的是 Prefork
则表示当前工作在 Prefork 模式
同理出现 Worker
则表示工作在 Worker 模式
或者出现 Event
即工作在 Event 模式
在编译的时候
我们可以通过 configure 的参数来指定模式
--with-mpm=prefork|worker|event
也可以编译为三种模式都支持
然后再通过修改具体配置来进行更换
--enable-mpms-shared=all
不同的 MPM 工作模式
会影响 Apache 的响应速度和可伸缩性
从进程服务分配项中
我们也可以看到它们的不同之处
☟☟☟
Prefork 工作模式
# perfork MPM
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxRequestsPerChild 0
Prefork 模式在 Apache 运行之初,就预先 fork 一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。Prefork 模式适合于没有线程安全库(且需要避免线程兼容性问题)的系统。
优点:成熟稳定,兼容所有新老模块,同时不需要担心线程安全的问题,具有很强的自我调节能力,只需要很少的配置指令即可调整。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。Prefork 模式并不擅长处理高并发请求,而是会将请求放进队列中,一直等到有可用进程,请求才会被处理。因此需要将 MaxClients 设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
Worker 工作模式
# worker MPM
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxRequestsPerChild 0
Worker 模式使用了多进程和多线程的混合模式。它也预先 fork 了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。
优点:由于使用线程来处理请求,所以可以处理海量请求,且占据更少的内存,在高并发下表现更优秀。
Event 工作模式
# event MPM
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxRequestsPerChild 0
Event 模式中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放,这样就增强了高并发场景下的请求处理能力。Event 模式在遇到某些不兼容的模块时会失效,将会回退到 Worker 模式,一个工作线程处理一个请求。
优点:它解决了 keep-alive 场景下,长期被占用的线程的资源浪费问题,且能在一定程度上保证线程安全。
缺点:消耗的系统资源少于 Prefork 模式,但高于 Worker 模式,且不能在 HTTPS 访问下工作。
总的来说
Prefork 模式的速度要稍高于 Worker 模式
可需要的 cpu 和 memory 资源也稍多于 Woker
Worker 模式可以应对高流量
但是安全性不太好
以前 Apache 的主流模式为 Prefork
现在 Worker 模式也开始多了起来
而 Event 模式是 Worker 模式的升级版
逐渐受到越来越多用户的重视
附录:配置项注释
# StartServers:
#指定服务器在启动时建立的子进程数量
# MinSpareThreads:
#指定空闲子进程的最小数量
# MaxSpareThreads:
# 配置空闲子进程的最大数量
# ThreadsPerChild:
# 每个子进程建立的常驻的执行线程数
# MaxRequestWorkers:
# 限定服务器同一时间内客户端最大接入的请求数量
# MaxRequestsPerChild:
# 每个子进程在其生命周期内允许最大的请求数量
获取更多产品介绍及业界动态
以上是关于解析 Apache 的三种 MPM 工作模式的主要内容,如果未能解决你的问题,请参考以下文章
Apache的三种MPM模式比较:prefork,worker,event