Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1746744
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: LINUX

2012-11-16 15:59:58

前言:

有两种方式可以查看apache的工作模式,一是通过查看./build/config.nice文件,这个文件时编译的参数,编译的时候是什么模式,那么apache就是什么模式,如果要改变的话,那么就需要重新编译,如下:


点击(此处)折叠或打开

  1. #! /bin/sh
  2. #
  3. # Created by configure
  4. "./configure" \
  5. "--prefix=/home/sjg/lamp/apache" \
  6. "--enable-so" \
  7. "--enable-cgi" \
  8. "--enable-module=rewirte" \
  9. "$@"
二是通过./bin/apachectl -l命令查看,如下:


点击(此处)折叠或打开

  1. ......
  2. prefork.c
  3. ......

其中有prefork.c,说明apache的工作模式是prefork。

1、介绍:

Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。

MPM:Multi-Processing Modules,多道处理模块

在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中

 

指定mpm的方法:

./configure --help | grep mpm

  --with-mpm=MPM          Choose the process model for Apache to use.
                          MPM={beos|event|worker|prefork|mpmt_os2|winnt}

 

我只看了preforkworker两种,在网上查资料说,其他的mpm不安全,不推荐使用。

2prefork  & worker

prefork的工作原理及配置

 

如果不用“--with-mpm”显式指定某种MPMprefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式,没有用到线程,进程彼此之间相互独立,这也是mpm之所以稳定的原因之一。

 

使用

bash apachectl -l

或者

./httpd -l

查看是否为prefork.c模式

如果是worker.c的话,就是worker模式

 

Apache 2.2.23版本中的默认配置是

 


    StartServers          5
    MinSpareServers       5
    MaxSpareServers       10
    MaxClients          150       #最为重要一个参数
    MaxRequestsPerChild   0



一个配置:


StartServers         20
MinSpareServers      10
MaxSpareServers     30
ServerLimit        1000
MaxClients         512
MaxRequestsPerChild  1000

 

3prefork工作原理:

1)控制进程在最初建立StartServers个进程;

2)为了满足MinSpareServers设置,则等待1秒钟,继续创建2个进程,再等待1秒钟,创建4个进程......如此指数级的创建进程,最多达到每秒创建32个进程(这种方式,可以在请求没有来之前,提前创建好进程,避免请求到来之时创建进程带来的系统开销,这也是预派生的由来);如果kill掉一个子进程之后,就会等待一秒钟,然后创建一个进程。

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

4MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:可防止意外的内存泄漏;在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。

因此,httpd那些进程都是最近才启动的  

5MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制是2562.2.3最大限制也是256)。如果把这个值设为大于256,那么Apache将无法起动(我测试的结果是可以启动的)。事实上,256对于负载稍重的站点也是不够的。

6ServerLimint是当MaxClients在最大值仍然不够用的时候,可以使用此选项。2.2.23中,默认的ServerLimit200000,可以在server/mpm/prefork/prefork.c中修改一个宏定义。

 

4、测试结果:

1)启动之后的进程数是:

StartServers                min

MinSpareServers             start

MaxSpareServers            start>max

实际还需要加1个进程,多了一个控制进程

2MaxSpareServers不论配置的多少,至少要是MinSpareServers+1

3)测试的时候StartServers最大值是150,超过这个值是徒劳的,而且当StartServers的值大于MaxSpareServers的时候,将会自己kill掉,直到MaxSpareServers为止。

 

 

5worker工作原理

支持多线程和多进程的混合模型的MPM,由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性


          StartServers          2
          MaxClients          150
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadsPerChild      25
          MaxRequestsPerChild   0

主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。

MinSpareThreads:最少空闲线程

MaxSpareThreads:最多空闲线程

MaxClients:所有线程的总和

ThreadLimit:如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程,默认最大值是16,可以通过此选项显式增大

注:

Worker模式的还没有测试,关于MaxClients的最优值,自己还没有想清楚;另外,worker模式的参数也没有验证和测试,我后续测试一下,给大家补充上,部分内容参考网上资料。

阅读(4902) | 评论(1) | 转发(0) |
1

上一篇:Kill -HUP详解

下一篇:负载均衡算法小结

给主人留下些什么吧!~~

xiquyila2014-12-01 10:50:17

楼主,请问一下,apache 在MPM下的 负载均衡的算法是怎么实现的, 比如必要的共享机制、每个请求由哪个进程、线程响应等等?