IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Apache MPM(Multi-processing module) 学习笔记

    longhao (longtask@gmail.com)发表于 2010-07-13 20:55:58
    love 0

    编译参数:

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

    MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool|win_nt}
    linux和unix下面默认为profork模式,常用的有worker模式和profork模式,windows下面是win_nt模式。

    1:profork

    工作原理:一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空 闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。将MaxClients设置为一个足够大的数值以处理潜在的请求高 峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

    优点:具有很强的自我调节能力,只需要很少的配置指令调整。


    默认值 说明
    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",子进程将永远不会结束。

    2:worker

    工作原理:每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可 以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

    优点:由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM,是apache2.0后的发展趋势。

    典型设置:
    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,每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。

    3:event

    event多路处理模块(MPM)被设计成面向需要处理大量并发连接的场合(特别是在开启KeepAlive的场合),它基于worker开发,并且配置 指令与worker完全相同。

    要使用event MPM,你必须在配置脚本configure的命令行上使用--with-mpm=event选项。

    该MPM依赖于APR用于线程同步的compare-and-swap原子操作,并且你还需要在configure命令行上使用--enable- nonportable-atomics=yes选项。如果你为x86平台编译,那么最低要求i486以上的CPU支持;如果你为SPARC平台编译,那 么最低要求UltraSPARC芯片。因为更老的CPU不支持compare-and-swap原子操作。



沪ICP备19023445号-2号
友情链接