Apache 为改善HTTP的"'keep alive"问题,在2.0版本上引入了MPM(Multi -Processing Modules,多道处理模块)本文主要描述说明MPM(Multi -Processing Modules,多道处理模块)的基本工做原理和应用上的局限。 html
运行如下代码: linux
$ ./configure --help|grep mpm apache
显示以下: windows
--with-mpm=MPM 安全
Choose the process model for Apache to use. 服务器
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool} 多线程
BeOSbeos架构
Netwarempm_netware运维
OS/2mpmt_os2ide
Unixprefork
Windowsmpm_winnt
leader和threadpool都是基于worker的变体,还处于实验性阶段,本文主要描述prefork和worker这两种模式工做原理。 ( 有关的详细说明,请参见Apache官方文档:
[url]http://httpd.apache.org/docs/2.2/mod/prefork.html[/url]
[url]http://httpd.apache.org/docs/2.2/mod/worker.html[/url]
)
prefork的工做原理及配置
若是不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork自己并无使用到线程,2.0版使用它是为了与1.3版保持兼容性;另外一方面,prefork用单独的子进程来处理不一样的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
若使用prefork,在make编译和make install安装后,使用“httpd -l”来肯定当前使用的MPM,应该会看到prefork.c(若是看到worker.c说明使用的是worker MPM,依此类推)。
缺省生成的httpd.conf配置文件,里面包含以下配置段:
<IfModule prefork.c>;
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>;
prefork的工做原理是,控制进程在最初创建“StartServers”个子进程后,为了知足MinSpareServers设置的须要建立一个进程,等待一秒钟,继续建立两个,再等待一秒钟,继续建立四个……如此按指数级增长建立的进程数,最多达到每秒32个,直到知足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式能够没必要在请求到来时再产生新的进程,从而减少了系统开销以增长性能。
MaxSpareServers设置了最大的空闲进程数,若是空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但若是设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。若是站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild设置的是每一个子进程可处理的请求数。每一个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可使每一个子进程处理更多的请求,但若是设成非零值也有两点重要的好处:
◆ 可防止意外的内存泄漏;
◆ 在服务器负载降低的时侯会自动减小子进程数。
MaxClients是这些指令中最为重要的一个,设定的是Apache能够同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,若是请求总数已达到这个值(可经过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下不少而HTTP访问却很慢的主要缘由。系统管理员能够根据硬件配置和负载状况来动态调整这个值。虽然理论上这个值越大,能够处理的请求就越多,但Apache默认的限制不能大于256。若是把这个值设为大于256,那么 Apache将没法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。若是要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把256改成要增大的值(如4000),而后从新编译Apache便可。在Apache 2.0中新加入了ServerLimit指令,使得无须重编译Apache就能够加大MaxClients。下面是笔者的prefork配置段:
<IfModule prefork.c>;
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>;
Server limits的描述参阅
[url]http://httpd.apache.org/docs/2.2/mod/mpm_common.html#serverlimit[/url]
在perfork和Worker两种模式下定义不一样。
worker的工做原理及配置
相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。因为使用线程来处理,因此能够处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。可是, worker也使用了多进程,每一个进程又生成多个线程,以得到基于进程服务器的稳定性。这种MPM的工做方式将是Apache 2.0的发展趋势。
在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>;
worker的工做原理是,由主控制进程生成“StartServers”个子进程,每一个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。一样,为了避免在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了全部子进程中的线程总数。若是现有子进程中的线程总数不能知足负载,控制进程将派生新的子进程。
MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,能够按照实际状况相应调节。
ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,若是负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的如下两行:
#define DEFAULT_THREAD_LIMIT 64
#define MAX_THREAD_LIMIT 20000
这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure以前就把64改为所但愿的值。注意,不要把这两个值设得过高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。
Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。若是负载很大,现有的子进程数不能知足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也须要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的如下两行:
#define DEFAULT_SERVER_LIMIT 16
#define MAX_SERVER_LIMIT 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 0
</IfModule>;
应用上的局限:
到目前为止,MPM和mod_ssl模块是不兼容的。二者不能同时运行。
博主仍从事运维行业,拥有10年+ 一线运维经验,技术上靠得住(还行吧),生活不容易,纯粹补贴家用,时间充裕,与有须要的朋友 互相帮助。
业务范围:网站、服务器、系统(linux|windows)、架构、部署、调优、排错、安全方案、低成本解决中小量攻鸡、业务上云(全部公有云)
合做形式:代维、兼职、临时技术支持
合做理念:诚信第1、信任是基石、不解决问题不收钱、完工才收
职业操守:讲诚信和毫不影响用户数据安全,您信任后再合做
客户监督:本博文评论一直开放,合做的朋友们可自由发表合做后对个人评价(坏朋友请放过我吧0_0)
联系方式:QQ:278566109
自评:个人技术不是很好也不是不好,自信能解决绝大多数问题。截止目前合做过的项目20个左右。相信合做后不会让您失望。
鉴于运维的敏感性,信任是很重要的,有须要的朋友们能够联系我,谢谢照顾与支持,感恩~~