Apache2 中的 prefork/worker/event

三种 MPM(Multi-Processing Module) ,最古老的 prefork,worker 以及比较新的 event 模式。
prefork 一个进程一个线程,worker 一个进程多个线程,event 在 worker 基础上做了更大的改进,前两者还是使用的是 select I/O 模型,而 event 则需要 glibc 的 EPoll 的支持。
总结一下,prefork 对线程支持不太好的可以使用,多进程模式,需要经常 fork 子进程,耗资源;worker 在大流量时更适合,消耗资源相对较少。
进程跟线程的关系,区别网上有很多,简单讲,一个程序至少有一个进程,一个进程至少有一个线程。线程划分的尺度更小,并发性更高。

查看目前的 MPM:
# apache2 -v
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Nov  3 2011 03:30:19
# apache2 -l
Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  worker.c
  http_core.c
  mod_so.c

下面的配置取自 /etc/apache2/apache2.conf

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    ServerLimit            1000
    MaxClients          150
    StartServers          5  
    MinSpareServers       5  
    MaxSpareServers      10 
    MaxRequestsPerChild   10000  
</IfModule>

默认 MaxClient 最大为 256,如果想继续增加,需要配合 ServerLimit 参数。注意二者的先后顺序。
MaxRequestsPerChild 表示每个子进程的最大请求数量,到达 MaxRequestsPerChild 之后,子进程将会被杀死。如果 MaxRequestsPerChild 为 0,表示子进程将永远不会结束,可能会出现内存泄漏,最终耗尽内存,所以设置一个非零值会比较合理。同样,这会消耗一部分创建/销毁进程的资源。

prefork 模式下,需要不断的对 MaxClients 进行调整达到一个最佳状态:既能支持很大的请求数,有能保持内存的可用性。对于小内存的机器,prefork 不推荐。

# worker MPM
# Upper limit on configurable number of processes
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
    ServerLimit          16
    StartServers          2  
    MinSpareThreads      25 
    MaxSpareThreads      75 
    ThreadLimit          364 
    ThreadsPerChild      25 
    MaxClients          150
    MaxRequestsPerChild   0  
</IfModule>

目前这个版本(2.2.14)默认使用就是 worker 模式。跟前者相比,多了个 ThreadsPerCild 指令。

#apt-get install apache2-mpm-worker
# event MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_event_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

event 模式在并发行上应该是三者最佳的,但是目前不支持 HTTPS。

除了上面的三种模式,apache 还有其他的模式,比如 beos/leader 等等,在编译的时候,加上 –with-mpm=preforker/worker/event 参数就可以了