apache配置mpm_worker(多道处理模块)
worker的工作原理及配置
worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性
configure -with-mpm=worker && make && make install(不指定worker,默认linux/unix采用的是prefork)
配置:
<IfModule mpm_worker_module>
 #   StartServers          2 //初始化建立的进程数
 #   MaxClients          150 //所有子进程中的线程总数
 #   MinSpareThreads      25 //最少空闲线程数(为了不在请求到来时再生成线程)
 #   MaxSpareThreads      75 //最大空闲线程数
 #   ThreadsPerChild      25 //每个子进程数包含的线程数
 #   MaxRequestsPerChild   0 //控制服务器建立新进程和结束旧进程的频率
     StartServers        60
     MaxClients        3200
     ServerLimit        100
     MinSpareThreads   1920
     MaxSpareThreads   3200
    #ThreadLimit        512
     ThreadsPerChild     32
     MaxRequestsPerChild  300
</IfModule>
公式:活动子进程的最大数量=MaxClients/ThreadsPerChild
      MaxChients=ThreadsPerChild的整数倍
      ServerLimit(活动子进程数量的硬限制)>= 活动子进程的最大数量
      ThreadLimit(所有服务线程总数的硬限制)>=ThreadsPerChild      
      ServerLimit*ThreadsPerChild >= MaxClient
注意:ServerLimit,ThreadLimit必须放在前列
worker的工作原理是,由主控制进程生成“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将会自动调节到一个相应值(可能是个非期望值)。
实验:
ServerLimit没写就是16,它决定系统最多启动几个httpd进程。
ThreadLimit 没写默认是64,
ThreadsPerChild* ServerLimit=25*16=400,
400就是系统理论支持的最大并发。
MaxClients<ThreadsPerChild* ServerLimit,
MaxClients如果大于400将被限制在400.
400只是理论最大并发,实际并发就是MaxClients的值。
我做了如下试验:
第一次,ab -n 10000 -c 5000 http://192.168.1.101/
Time taken for tests:   127.952487 seconds
Requests per second:    78.15 [#/sec] (mean)
Time per request:       63976.242 [ms] (mean)
Time per request:       12.795 [ms] (mean, across all concurrent requests)
Transfer rate:          22.89 [Kbytes/sec] received
第二次,ab -n 10000 -c 400 http://192.168.1.101/
Time taken for tests:   138.340074 seconds
Requests per second:    72.29 [#/sec] (mean)
Time per request:       5533.603 [ms] (mean)
Time per request:       13.834 [ms] (mean, across all concurrent requests)
Transfer rate:          21.17 [Kbytes/sec] received
第三次,ab -n 10000 -c 150 http://192.168.1.101/
Time taken for tests:   6.727553 seconds
Requests per second:    1486.42 [#/sec] (mean)
Time per request:       100.913 [ms] (mean)
Time per request:       0.673 [ms] (mean, across all concurrent requests)
Transfer rate:          435.37 [Kbytes/sec] received
前提:访问apache的静态页面,本机。
结论是:并发如果大于MaxClients,服务器的效率会很低,如果并发等于小于MaxClients,10000个请求将迅速被处理完毕,效率很高