解析 Apache 的三种 MPM 工作模式

Posted 研发云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析 Apache 的三种 MPM 工作模式相关的知识,希望对你有一定的参考价值。

作为颇具统治力的 Web 应用中间件

Apache 的诸多特点属性早已为人所熟知

例如 MPM(多重处理模块)

就是它的核心组件之一

Apache 通过 MPM 来使用操作系统的资源

并对进程和线程池进行管理

而 MPM 目前主要有三种工作模式

从最早期的 Prefork,到后来的 Worker

再到最新的 Event

工作模式的变化也代表着 Apache

为了适应服务需求所做出的自我调整

解析 Apache 的三种 MPM 工作模式

Prefork 模式为多进程方式

该模式会为每个请求起一个进程响应

是 Unix 平台上默认的(缺省)模式

Worker 模式为多线程方式

每个线程响应一个请求

Event 基于异步 I/O 模型

每个进程或线程响应多个用户请求

解析 Apache 的三种 MPM 工作模式

如果 Apache 已经安装

可以用 "httpd -I" 或者 "httpd -V" 命令

来查看当前的工作模式

若 Server MPM 显示的是 Prefork

则表示当前工作在 Prefork 模式

同理出现 Worker

则表示工作在 Worker 模式

或者出现 Event

即工作在 Event 模式

在编译的时候

我们可以通过 configure 的参数来指定模式

--with-mpm=prefork|worker|event

也可以编译为三种模式都支持

然后再通过修改具体配置来进行更换

--enable-mpms-shared=all

解析 Apache 的三种 MPM 工作模式

不同的 MPM 工作模式

会影响 Apache 的响应速度和可伸缩性

从进程服务分配项中

我们也可以看到它们的不同之处


Prefork 工作模式

# perfork MPM

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxRequestWorkers 250

MaxRequestsPerChild 0

解析 Apache 的三种 MPM 工作模式

Prefork 模式在 Apache 运行之初,就预先 fork 一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。Prefork 模式适合于没有线程安全库(且需要避免线程兼容性问题)的系统。


优点:成熟稳定,兼容所有新老模块,同时不需要担心线程安全的问题,具有很强的自我调节能力,只需要很少的配置指令即可调整。


缺点:一个进程相对占用更多的系统资源,消耗更多的内存。Prefork 模式并不擅长处理高并发请求,而是会将请求放进队列中,一直等到有可用进程,请求才会被处理。因此需要将 MaxClients 设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。


Worker 工作模式

# worker MPM 

StartServers 3

MinSpareThreads 75

MaxSpareThreads 250 

ThreadsPerChild 25

MaxRequestWorkers 400

MaxRequestsPerChild 0

解析 Apache 的三种 MPM 工作模式

Worker 模式使用了多进程和多线程的混合模式。它也预先 fork 了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。


优点:由于使用线程来处理请求,所以可以处理海量请求,且占据更少的内存,在高并发下表现更优秀。



Event 工作模式

# event MPM

StartServers 3

MinSpareThreads 75

MaxSpareThreads 250

ThreadsPerChild 25

MaxRequestWorkers 400

MaxRequestsPerChild 0

解析 Apache 的三种 MPM 工作模式

Event 模式中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放,这样就增强了高并发场景下的请求处理能力。Event 模式在遇到某些不兼容的模块时会失效,将会回退到 Worker 模式,一个工作线程处理一个请求。


优点:它解决了 keep-alive 场景下,长期被占用的线程的资源浪费问题,且能在一定程度上保证线程安全。


缺点:消耗的系统资源少于 Prefork 模式,但高于 Worker 模式,且不能在 HTTPS 访问下工作。


解析 Apache 的三种 MPM 工作模式

总的来说

Prefork 模式的速度要稍高于 Worker 模式

可需要的 cpu 和 memory 资源也稍多于 Woker

Worker 模式可以应对高流量

但是安全性不太好

以前 Apache 的主流模式为 Prefork

现在 Worker 模式也开始多了起来

而 Event 模式是 Worker 模式的升级版

逐渐受到越来越多用户的重视

附录:配置项注释

# StartServers:

#指定服务器在启动时建立的子进程数量

# MinSpareThreads:

#指定空闲子进程的最小数量

# MaxSpareThreads:

# 配置空闲子进程的最大数量

# ThreadsPerChild:

每个子进程建立的常驻的执行线程数

# MaxRequestWorkers:

# 限定服务器同一时间内客户端最大接入的请求数量

# MaxRequestsPerChild:

# 每个子进程在其生命周期内允许最大的请求数量


研发云  开发者的好帮手

获取更多产品介绍及业界动态

以上是关于解析 Apache 的三种 MPM 工作模式的主要内容,如果未能解决你的问题,请参考以下文章

Apache的三种MPM模式比较:prefork,worker,event

Apache 工作的三种模式:PreforkWorkerEvent

apache的三种工作模式

Apache的三种工作模式

Apache三种工作模式介绍与配置

Apache的三种工作模式