登录 |  注册 |  繁體中文


Apache MPM(Multi-processing module,多路处理模块)分析

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(2177) | 评论(0)

    编译参数:

    –with-mpm=MPM Choose the process model for Apache to use.

     MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool|win_nt}
可以使用 apachectl -l 命令查看当前使用的工作模式。linux和unix下面默认为prefork模式,常用的有worker模式和prefork模式,windows下面是win_nt模式。下面就介绍两个常用的,其它的就不做介绍了。

 

    1:prefork

工作原理:控制进程在最初建立“StartServers”个子进程,各子进程在某个确定的时间只能处理一个不同的请求,进程之间是彼此独立的,它没有线程概念,所以能够使用那些没有处理好线程安全的第三方模块,这也使其成为最稳定的MPM之一在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用比较大。

优缺点:具有很强的自我调节能力,只需要很少的配置指令调整。是使用最多而且最稳定的工作模式

  默认值 说明
MaxSpareServers 10 空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
MinSpareServers 5 空闲子进程的最小数量
StartServers 5 服务器启动时默认建立的进程数。
ServerLimit 最大200000,编译默认20000 只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
MaxClients 256 MaxClients 指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最 大值为止。一旦一个链接被释放,队列中的请求将得到服务。对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请 求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit 。
MaxRequestsPerChild 10000 每个子进程允许处理的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。

 实例说明以上参数:

StartServers:这个看了就明白了。
 
MinSpareServers:apache在没有用户访问时候有5个闲置的进程,如果有一个用户访问网站。则闲置的进程就只有4个,这个值小于MinSpareServers,所以 apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程。直到大于等于MinSpareServers个空闲进程才结束。
 
MaxSpareServers:apache在没有用户访问时候有5个闲置的进程,如果有5个用户同时访问网站。则闲置的进程就只有0个,这个值小于MinSpareServers,所 以apache就以第一秒1个进程,第二秒2个进程,第三秒4个进程的速度新建空闲进程。直到大于等于MinSpareServers个空闲进程才结束。 在这个例子中直到第三秒,一共生成1+2+4个进程才能满足大于等于MinSpareServers的要求。后来这5个用户访问完apache,访问结 束,关闭浏览器。所以apache就有了5+7个空闲的进程。这时空闲的进程比较多,apache就开始关闭一些进程,直到满足小于 MaxSpareServers个空闲进程才结束。如果该值小于MinSpareServers则apache默认将该值设置成 MinSpareServers+1。
 
ServerLimit:这个参数是控制apache的进程总数的,那为什么会有两个参数控制apache的进程总数呢?这个参数在apache1的时代 是没有的,因为那个时候有个256M内存的服务器就很厉害了。后来apache2的时代到来,服务器的硬件也得到升级。很多服务器都是4G内存,还有很多 比4G内存大的服务器出现。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256定死了。但是到了 apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。
 
MaxClients:apache最大的进程数。apache1的时代只有一个MaxClients参数控制进程总数就够了,而这个参数最大值是256 定死了。但是到了apache2的时代必须调整ServerLimit值大于256才能使MaxClient支持大于256的值。
 
MaxRequestsPerChild:apache在没有用户访问的时候有5个空闲进程。当一个用户访问网站,访问完又离开。则apache的第一个进程就处理了一个请求,从新进入闲置状态。 再有一个用户访问网站,访问完后离开。则apache的第一个进程就处理了1+1个请求。这样继续访问3998个用户,这个进程就处理了4000个请求, 之后就自动关闭这个进程。这个时候apache就只有4个限制的进程,小于MinSpareServers值所以apache从今建立一个空闲进程。至于 为什么处理完4000个请求就要关闭这个进程呢?答案之一:为了防止内存的泄露。
 
 

    2:worker

工作原理:由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数.如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。由于线程共享内存空间,所以一个程式在运行时必须被系统识别为”每 个线程都是安全的”。

优点:通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多,是apache2.x后的发展趋势。但worker MPM也由不完善的地方,假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”

典型设置:
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

  默认值 说明
MaxSpareThreads 250 最大空闲线程数
MinSpareThreads 75 最小空闲线程数
StartServers 3 设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数
ServerLimit 最大200000,编译默认20000 只有需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。
MaxClients 50 表示可以用于伺服客户端请求的最大线程数量。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。
ThreadsPerChild 25 这 个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了。如果使用一个类似于mpm_winnt只有一个子进程的 MPM,这个数值要足够大,以便可以处理可能的请求高峰。如果使用一个类似于worker有多个子进程的MPM,每个子进程所拥有的所有线程的总数要足够 大,以便可以处理可能的请求高峰。

 




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部