[导入]apache的性能优化之mpm

      
    apache作为一个优秀的web服务器,在性能方面有着非常灵活的伸缩性和可调控性,本文专门小结一下apache的mpm对性能的影响
     mpm中文翻译为多路处理模块,apache2.0以后的版本将这种模块化的设计延伸到了web服务器的基础功能上。2。0以后的所有版本都带有MPM的选择,本文主要是讨论worker方式和prefork方式。可以在编译的时候--with-mpm=worker || prefork来指定,如果是用rpm包安装的,则默认就是prefork方式,不过可以在启动的时候选择用什么模式启动。比如在以红帽系列发行版本系统上,就可以
引用
/usr/sbin/httpd    
    
----- 以prefor方式启动
引用
/usr/sbin/httpd.worker  
----worker 以worker方式启动

下面来说一说prefork方式的
它的工作方式是以一个单独的控制进程,也叫父进程负责产生子进程,子进程负责监听和处理客户端发出的请求,而且一般apche都会保持一些备用的空闲子进程用于“储备”作用应付新来连接的客户端的请求,这样每当有新的连接出现时,对服务器端来说,不用每次都要让父进程去产生子进程处理请求,对客户端来说,也不用每次都要等待服务器端的子进程产生出来后才能得到处理。参考最权威的《apache参考指南》,对apache的工作方式有非常详细的解释。

这是apache安装后的默认配置段

<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>


其中StartServers设置服务器启动时建立的子进程数量。
MinSpareServers设置服务器空闲子进程的最小数量。意思就是说,如果当前空闲子进程数少于MinSpareServers ,则Apache将以最大每秒一个的速度产生新的子进程。这个参数对性能影响很小,设置太大了,反而会增加服务器的负担。

MaxSpareServers设置空闲子进程的最大数量。意思就是说,如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。所以实际上,服务器总是保证空闲子进程的数量在MinSpareServers和MaxSpareServers之间。这个值对性能的影响也是非常小的。

MaxClients设置了同时可以处理的最大接入请求数。这个参数对prefork方式的性能影响是最大的,任何超过MaxClients限制的请求都将进入等候队列,这就是为什么有些服务器的负载不是很高,但是访问很慢的重要原因了。MaxClients的默认值是256,对于访问量不是很大的网站是够了,但是对于负载比较高,访问量大的网站,则明显是不够的,需要调整这个值的大小,直接调整就会报错,这个时候必须引入另一个参数ServerLimit 。serverlimit是设置服务器允许配置的进程数的上限,对于prefork型的MPM,这个指令设置了MaxClients最大允许配置的数值。注意了,Apache在编译时内部有一个硬限制"ServerLimit 20000"(对于preforkMPM为"ServerLimit 200000")。也就是你不管怎么设置,也不能操作这个硬限制的极限。

MaxRequestsPerChild设置了是服务器每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后就会自动销毁。设置为0意味着没有限制,即子进程永不销毁。设置为0不是什么好事,有可能会造成服务器不稳定,内存泄露,系统崩溃。

上面的指令解释完了,我就把我维护的机器上apache的配置段帖出来供参考

服务器 双核 + Xeon 3.0 + 4Gmem

<IfModule prefork.c>
ServerLimit 20000
StartServers 20
MinSpareServers 40
MaxSpareServers 80
MaxClients 10000
MaxRequestsPerChild 10000
</IfModule>



下面来说说worker方式的
worker方式和prefork方式有很大不同,worker是用多线程和多进程混合模型的MPM。用线程来处理请求,相对来说,可以处理更多的客户端请求,并且系统开销要小于prefork这种基于进程的方式。
以worker方式安装后的默认配置段:

<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
主控制进程生成StartServers个子进程,每子进程中包含固定的ThreadsPerChild线程数,每一个线程独立的处理请求,配置段中MinSpareThreads和MaxSpareThreads设置最少和最多的空闲线程数,MaxClients 设置了同时连入的客户端最大连接总数。
MinSpareThreads最大值为75
MaxSpareThreads最大值为250
这两个值对性能影响不大。

对性能影响最大的是ThreadsPerChild这个值,他是每个子进程建立的线程数,默认最大值是64,比较小,我们需要调整,同样,直接调整没用,需要引入ThreadLimit这个参数,ThreadLimit设置了每个子进程可配置的线程数上限,它的最大缺省值是20000,实际上,还有个限制,那就是worker方式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxClients,默认情况下最大的子进程总数是16,要增加的话,同样要引入ServerLimit,而且它乘以 ThreadsPerChild的值必须大于等于MaxClients,并且MaxClients必须是ThreadsPerChild的整数倍,不然apache无法启动

最后给出一组参考值

<IfModule worker.c>
ServerLimit 30
ThreadLimit 200
StartServers 3
MaxClients 2500
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
同时保证
1。 MaxClients为ThreadsPerChild的整数倍
2。 ServerLimit * ThreadsPerChild > = MaxClients

-----------------------------EOF-----------------------------------------------
Tags - apache性能 , worker , prefork , mpm
文章来源:http://www.askwan.com/read.php?63
posted @ 2008-07-11 06:05  万志华  阅读(315)  评论(0编辑  收藏  举报