Apache2性能优化之MPM(2)

$ ./configure --help|grep mpm    显示如下:
--with-mpm=MPM      Choose the process model for Apache to use. 
MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool}

解释:Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作; 因此,我们主要关注prefork和worker这两种和性能关系最大的产品级MPM ;

在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:
<IfModule worker.c>;
    StartServers 2
    MaxClients 150
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadsPerChild 25
    MaxRequestsPerChild 0
</IfModule>;

工作原理:由主控制进程生成 StartServers 个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求;同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250;这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节;

ThreadsPerChild是worker MPM中与性能相关最密切的指令;ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的;这时要显式使用 ThreadLimit指令,它的最大缺省值是20000;

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients;如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程;默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)

需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值);

下面是一个修改后的 worker配置段:
<IfModule worker.c>;
    StartServers 3
    MaxClients 2000
    ServerLimit 25
    MinSpareThreads 50
    MaxSpareThreads 200
    ThreadLimit 200
    ThreadsPerChild 100
    MaxRequestsPerChild 10000
</IfModule>;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psjjp.html