Apache的MPM

Apache的核心特征和多处理模块:


core:一直可用的apache http服务器的核心功能

mpm_common:有一个以上的MPM实现的指令的集合

beos:为BEOS特别优化的MPM

event:基本的worker MPM的实验变种

mpm_netware:MPM专门为Novell NetWare实施优化的一个线程web服务器优化

mpmt_os2:专门为OS/2混合多进程、多线程的MPM

prefork:一个非线程,预派生的web服务器

mpm_winnt:这个是为Windows NT优化的MPM

worker:MPM实施的一个杂合多线程多进程的web服务器


MPM主要职责:

  1. 根据Apache运行的操作系统平台来优化Apache。

  2. 提高Apache的效率。

  3. 保证Apache的安全。


MPM是唯一一个系统层的模块,Apache在编译的时候指定所要使用的MPM模块,下图是MPM在系统结构中的位置

wKiom1MAYZaA4Lh1AAGBXQPW4A8928.jpg

现在查看Apache使用的是哪一种MPM,可以使用httpd命令来查看

[root@Wiker ~]# httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c


下面列出了不同系统的默认的MPM,如果你不在编译的时候指定,那么它将是你要使用的MPM

BeOS

beos

Netware

mpm_netware

OS/2

mpmt_os2

Unix

prefork

Windows

mpm_winnt


Linux两个比较常用的MPM模块prefork、worker

prefork

   prefork实现了一个非线程型的、与派生的web服务器,适合于没有现成安全库,需要便面现成兼容性问题的系统。他是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他要求。这个MPM就有很强的自我调节能力,只需要很少的配置指令调整。

   prefork工作方式:由一个单独的控制进程(父进程)产生子进程,然后将这些子进程用于监听请求并作出应答,这些子进程在处理时并不产生线程。另外,Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。

   可以配置的主要参数:

  1. StartServers:指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。不同的MPM默认值也不一样。对于worker默认值是"3"。对于prefork默认值是"5"。

  2. MinSpareServers:指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers     ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。。

  3. MaxSpareServers:指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。

  4. MaxClients:指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最大值为止。一旦一个链接被释放,队列中的请求将得到服务。对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit。对于线程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客户端请求的最大线程数量。线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。。

  5. MaxRequestsPerChild:每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。

    将MaxRequestsPerChild设置成非零值有两个好处:
         1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
         2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

  6. ServerLimit:对于prefork MPM,这个指令设置了MaxClients最大允许配置的数值。对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。


Worker

  此MPM支持多线程多进程,由于使用线程来处理请求,所以可以处理海量请求,而且资源开销小于基于进程的MPM,但是他也使用多进程,每个进程又有多个线程,以获得基于进程的稳定性。每个进程拥有的线程数量是固定的,他可以根据负载情况增加或者减少进程数量。一个单独的控制进程负责子进程的建立,每个子进程可以建立threadsperchild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其船体给服务线程处理和应答。

   Apache总是试图维持一个备用或是空闲的服务线程池,这样客户端无需等待新线程或新建成的建立即可得到处理,初始化建立的进程数量由startservers指定决定,随后父进程检测所有子进程中空闲进程的总数,并新建或结束子进程使空闲线程的总数维持在MinSpareThreads和MaxSpareThreads所指定的范围内,由于这个过程是自动调整,几乎没有必要修改这些指令的缺省值,可以并行处理的客户端的最大数量取决于MaxClients指令。活动子进程的最大数量取决于MaxClients除以ThreadsPerChild的值。

有两个指令设置了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的)ServerLimit是活动子进程数量的硬限制,它必须大于或等于MaxClients除以ThreadsPerChild的值。ThreadLimit是所有服务线程总数的硬限制,它必须大于或等于ThreadsPerChild指令。这两个指令必须出现在其他workerMPM指令的前面。

   在设置的活动子进程数量之外,还可能有额外的子进程处于"正在中止"的状态但是其中至少有一个服务线程仍然在处理客户端请求,直到到达MaxClients以致结束进程,虽然实际数量会很小。这个行为能够通过以下禁止特别的子进程中止的方法来避免:

  1. 将MaxRequestsPerChild设为"0"。

  2. 将MaxSpareThreads和MaxClients设为相同的值。


总结

linux上测试发现preforkworker性能几乎是相当的,而且worker由一个巨大的坏处,比如一个用户的请求导致一个线程崩溃了,损坏了这些文件,进而可能导致联动效应,致使整个进程都崩溃了,城门失火殃及池鱼,导致进程上的其他的线程也崩溃了;prefork每个请求都是使用但都的进程来响应,所以即使单个进程崩溃最多影响一个客户端的请求,不会波及到其他的客户访问。


你可能感兴趣的:(apache,mpm)