分类: LINUX
2012-11-16 15:59:58
前言:
有两种方式可以查看apache的工作模式,一是通过查看./build/config.nice文件,这个文件时编译的参数,编译的时候是什么模式,那么apache就是什么模式,如果要改变的话,那么就需要重新编译,如下:
点击(此处)折叠或打开
点击(此处)折叠或打开
其中有prefork.c,说明apache的工作模式是prefork。
1、介绍:
Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。
MPM:Multi-Processing Modules,多道处理模块
在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中。
指定mpm的方法:
./configure --help | grep mpm
--with-mpm=MPM Choose the
process model for Apache to use.
MPM={beos|event|worker|prefork|mpmt_os2|winnt}
我只看了prefork和worker两种,在网上查资料说,其他的mpm不安全,不推荐使用。
2、prefork & worker
prefork的工作原理及配置
如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式,没有用到线程,进程彼此之间相互独立,这也是mpm之所以稳定的原因之一。
使用
bash apachectl -l
或者
./httpd -l
查看是否为prefork.c模式
如果是worker.c的话,就是worker模式
Apache 2.2.23版本中的默认配置是
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestsPerChild 0
一个配置:
StartServers 20
MinSpareServers 10
MaxSpareServers 30
MaxClients 512
MaxRequestsPerChild 1000
3、prefork工作原理:
(1)控制进程在最初建立StartServers个进程;
(2)为了满足MinSpareServers设置,则等待1秒钟,继续创建2个进程,再等待1秒钟,创建4个进程......如此指数级的创建进程,最多达到每秒创建32个进程(这种方式,可以在请求没有来之前,提前创建好进程,避免请求到来之时创建进程带来的系统开销,这也是预派生的由来);如果kill掉一个子进程之后,就会等待一秒钟,然后创建一个进程。
(3)MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers;
(4)MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:可防止意外的内存泄漏;在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。
因此,httpd那些进程都是最近才启动的
(5)MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制是256(2.2.3最大限制也是256)。如果把这个值设为大于256,那么Apache将无法起动(我测试的结果是可以启动的)。事实上,256对于负载稍重的站点也是不够的。
(6)ServerLimint是当MaxClients在最大值仍然不够用的时候,可以使用此选项。2.2.23中,默认的ServerLimit是200000,可以在server/mpm/prefork/prefork.c中修改一个宏定义。
4、测试结果:
1)启动之后的进程数是:
StartServers
min
MinSpareServers
start
MaxSpareServers start>max
实际还需要加1个进程,多了一个控制进程
2)MaxSpareServers不论配置的多少,至少要是MinSpareServers+1个
3)测试的时候StartServers最大值是150,超过这个值是徒劳的,而且当StartServers的值大于MaxSpareServers的时候,将会自己kill掉,直到MaxSpareServers为止。
5、worker工作原理
支持多线程和多进程的混合模型的MPM,由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性
StartServers
2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads
75
ThreadsPerChild 25
MaxRequestsPerChild 0
主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。
MinSpareThreads:最少空闲线程
MaxSpareThreads:最多空闲线程
MaxClients:所有线程的总和
ThreadLimit:如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程,默认最大值是16,可以通过此选项显式增大
注:
Worker模式的还没有测试,关于MaxClients的最优值,自己还没有想清楚;另外,worker模式的参数也没有验证和测试,我后续测试一下,给大家补充上,部分内容参考网上资料。