1.PMP

MPM(Multi -Processing Modules,多路处理模块)是Apache2.x中影响性能的最核心特性。

是Apache 2.x才支持的一个可插入的并发模型,在编译的时候,我们只可以选择一个并发模型。

Unix/Linux支持三种MPM,Prefork,worker,event

2.Prefork:

# prefork MPM
<IfModule prefork.c> 判断是否有prefork.c这个模块,有就生效,否则无效
StartServers       8 默认启动的工作进程数
MinSpareServers    5 最少空闲进程数
MaxSpareServers   20 最大空闲进程数
ServerLimit      256 最大活动进程数
MaxClients       256 最多允许发起的请求连接数
MaxRequestsPerChild  4000 每个子进程在生命周期能服务的最多请求数
</IfModule>


root      1898  0.0  0.3 186356  17:23   0:00 /usr/sbin/httpd :这是主进程
apache    1901  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd :这些和以下的都是子进程
apache    1902  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd
apache    1903  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd
apache    1904  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd
apache    1905  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd
apache    1906  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd
apache    1907  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd
apache    1908  0.0  0.2 186488  17:23   0:00 /usr/sbin/httpd

  Prefork是一个进程处理一个请求,在启动httpd的时候,如果选择的是这种模式,会首先创建一个主进程(控制进程)和StartServers个子进程,如代码段2,可以看到StartServers为8个.由于进程和进程之间是独享内存的,所以一个进程崩溃了不会影响到其他的进程,所以Prefork模式的稳定性比较好,但是进程多了消耗的内存会比较大.

主进程在创建了StartServers个子进程后,为了满足MinSpareServer的设置需求,会先创建一个进程,等待一秒,创建二个进程,再等待一秒,创建四个进程....以几何数增加创建的进程,最多达到每秒创建32个,直到满足MinSpareServer的设置(可以看到以下的MinSpareServer为5),这就是预派生(Prefork)的由来,这样不必等到有请求到来时才花时间创建新的进程,提高了系统响应速度以增加性能.

MaxSpareServers是最大空闲进程数,如果你的最大空闲进程数超过了这个数,Apache会自动kill掉多余的进程,如果这个值设置的比MinSpareServer小,Apache会自动调整该值为MinSpareServer+1.

ServerLimit:当前服务器上最多有多少个活动的进程数

Maxclient:并发请求的最大数,这个要小于等于ServerLimit,这个是对Apache性能影响很大的一个参数,理论上来说这个值越大,性能就越好.

MaxRequestsPerChild:每个子进程在处理MaxRequestsPerChild个请求后销毁

3.worker

<IfModule worker.c> 如果有这个模块就启用
StartServers         4 启动的子进程数
MaxClients         300 并发请求最大数
MinSpareThreads     25 最小空闲线程数
MaxSpareThreads     75 最大空闲线程数
ThreadsPerChild     25 每个子进程可生成的线程数
MaxRequestsPerChild  0 每个子进程可服务的最大请求数,0表示不限制
</IfModule>

root     25348  1.0  0.4 186560  4152 18:32   0:00 /usr/sbin/httpd.worker 主进程(控制进程)
apache   25352  2.0  0.5 596356  5372 18:32   0:00 /usr/sbin/httpd.worker 子进程
apache   25353  2.1  0.5 530820  5368 18:32   0:00 /usr/sbin/httpd.worker 子进程
apache   25369  1.5  0.5 530820  5372 18:32   0:00 /usr/sbin/httpd.worker 子进程

worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,每个线程处理一个请求,线程是共享内存空间的,所以一个线程崩溃会导致在这个进程下的所有线程都崩溃,所以他的稳定性没有Prefork好,但是内存使用率比Prefork低。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
  MinSpareThreads和MaxSpareThreads的最大缺省值分别是25和75。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

ThreadsPerChild是worker 中影响性能最重要的一个指标,Worker模式下所能同时处理的请求总数是由StartServers总数乘以ThreadsPerChild的值决定的,应该大于等于MaxClients,这里系统缺省值不知道为什么设置成这样,待我去问问????

累了..休息休息....