日期:2014-05-16  浏览次数:21013 次

Apache的多处理模块MPM

本博文主要参数 Apache 2.2文档以及Apache模块开发指南


Apache的整个运行可以分为两个阶段:启动阶段和运行阶段。

       在启动阶段时,它以ROOT特权来启动,进行解析配置文件(一般就是httpd.conf)、加载模块和初始化一些日志文件及内存共享段等操作,在启动阶段准备结束时,apache的控制转向多处理模块MPM,此时使得MPM能够在系统特权级运行,从而管理接下来的运行阶段。因为当处于运行阶段时,程序会放弃ROOT特权,以接收并处理网络中用户的服务请求,所以MPM也是在启动阶段初始化。

一,什么是MPM

       MPM,是Multi -Processing Modules的缩写,就是多处理模块的意思,它是在Apache 2.0中引入的一个概念,共引入目标是将Apache的结构能够模块化,把核心的任务处理作为一个可插拔的模块来运行,这样就很容易根据不同的环境和应用来更有效的优化Apache的运行,它是Apache2.X中最影响其性能的,最核心的特性,因为直接决定了Apache的工作方式。这里有一个问题是:它究竟怎么样影响了Apache。

      可以这么说:它决定了Apache以什么样的方式接入外部请求,如何Apache内部怎么样处理这个请求过程,这当然是最核心的了吧,比如它可以决定在处理外部请求的时候,需不需要启动多线程,如果是用多线程,最多可以多少个线程,一个进程可以产生最多多少个线程,类似于这种配置,都来自于MPM。MPM有一些指令可以专门用于调节父进程如何产生子进程,主要是StartServers,MinSpareServers,MaxSpareServers,MaxClients等,下面会介绍这些指令是什么意思。

它提供Apache服务程序和其所在的操作系统之间的接口,这个模块的主要职责是:

  1. 根据Apache运行的操作系统平台来优化Apache。
  2. 提高Apache的效率。
  3. 保证Apache的安全。

其实MPM本身也是一个模块,它是Apache中唯一一个系统层的模块,Apache在编译的时候选定一个所要使用的MPM模块,我们先来了解一下MPM模块在系统结构中的位置


在任何时候,一个正常的Apache都只有一个MPM模块在运行。

二,有哪些MPM可以被使用

在安装apache时,我们可以查看哪些MPM模块可以被使用。

[root@localhost httpd-2.2.11]# ./configure --help | grep mpm
  --with-mpm=MPM          Choose the process model for Apache to use.
                          MPM={beos|event|worker|prefork|mpmt_os2}

  1. beos是BEOS上的缺省MPM模块。
  2. mpmt_os2,这是专门针对OS/2优化过的混合多进程多线程多路处理模块(MPM)。
  3. event,一个标准workerMPM的实验性变种。
  4. worker,线程型的MPM,实现了一个混合的多线程多处理MPM,允许一个子进程中包含多个线程。
  5. prefork,一个非线程型的、预派生的MPM。
下面分针对这些模块进行讨论,我们怎么知道当前apache是编译了哪个MPM使用呢?
[root@localhost httpd-2.2.11]# /install/apache2/bin/httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
[root@localhost httpd-2.2.11]# 
这表示Apache当前的正在工作的MPM是prefork工作方式的MPM,这也是一种缺省的模块,如果需要其它的MPM模块,在编译的时候用--with-mpm指定。

三,prefork 

       Apache MPM prefork实现了一个非线程型的、预派生的web服务器。适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
       这种MPM的工作方式是:由一个单独的控制进程(父进程)产生子进程,然后将这些子进程用于监听请求并作出应答,这些子进程在处理时并不产生线程。另外,Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
可以用于配置该MPM如何工作的主要参数有:
  1. StartServers
    StartServers指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。不同的MPM默认值也不一样。对于worker默认值是"3"。对于prefork默认值是"5"。
  2. MinSpareServers
    MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。。
  3. MaxSpareServersMaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你