apache两种运行模式Perfork和Worker原理

 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的工做原理是,控制进程在最初创建&ldquo;StartServers&rdquo;个子进程后,为了知足MinSpareServers设置的须要建立一个进程,等待一秒钟,继续建立两个,再等待一秒钟,继续建立四个&hellip;&hellip;如此按指数级增长建立的进程数,最多达到每秒32个,直到知足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式能够没必要在请求到来时再产生新的进程,从而减少了系统开销以增长性能。 

 

MaxSpareServers设置了最大的空闲进程数,若是空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但若是设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。若是站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。 

 

MaxRequestsPerChild设置的是每一个子进程可处理的请求数。每一个子进程在处理了&ldquo;MaxRequestsPerChild&rdquo; 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可使每一个子进程处理更多的请求,但若是设成非零值也有两点重要的好处: 

 

 ◆ 可防止意外的内存泄漏; 

 

 ◆ 在服务器负载降低的时侯会自动减小子进程数。 

 

MaxClients是这些指令中最为重要的一个,设定的是Apache能够同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,若是请求总数已达到这个值(可经过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下不少而HTTP访问却很慢的主要缘由。系统管理员能够根据硬件配置和负载状况来动态调整这个值。虽然理论上这个值越大,能够处理的请求就越多,但Apache默认的限制不能大于256。若是把这个值设为大于256,那么 Apache将没法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。若是要加大这个值,必须在&ldquo;configure&rdquo;前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现&ldquo;#define HARD_SERVER_LIMIT 256&rdquo;这行。把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的工做原理是,由主控制进程生成&ldquo;StartServers&rdquo;个子进程,每一个子进程中包含固定的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个左右。相信合做后不会让您失望。

鉴于运维的敏感性,信任是很重要的,有须要的朋友们能够联系我,谢谢照顾与支持,感恩~~

相关文章
相关标签/搜索