设为首页 收藏本站
查看: 998|回复: 0

[经验分享] 第四章 apache的工作模式

[复制链接]

尚未签到

发表于 2018-11-25 12:17:51 | 显示全部楼层 |阅读模式
  版本V1.0
时间2012-10-04
版权GPL
作者itnihao 邮箱 itnihao@qq.com
博客 http://itnihao.blog.51cto.com
如需重新发行,请注明以上信息,谢谢合作


前言

本文档基于对apache的学习整理而成的笔记。本文档详细的记录了apache各种应用,以及一些个人的理解,如果偏差,请和我联系,以在下一个版本中进行更正。其中大部分文档均来自网络,感谢网络上各位朋友的分享,才有此文档的出现。其中本人对参考的部分网络文档进行适当的修改,以达到更好的参考效果。也希望各位积极的分享文档,为开源事业做出自己力所能及的贡献。

                                             itnihao  20121004日于成都

第四章 apache的工作模式
   查看编译参数的apache工作模式
DSC0000.png
beos|event|worker|prefork|mpmt_os2|winnt
可以看到apache的工作模式有6种,但常用的只有workerprefork两种,很多资料都说apache只有两种工作模式,这个说法是不对的
    以下内容网络转载,参考原文地址 http://www.xuan-lu.net/blog/index_771.html

1. beos 模式:
       支持beos模式,需要编译的时候加上–with-mpm=beos 即可. 此模式是BeOS平台上默认的多路处理模块(MPM)。它使用一个单独的控制线程来创建和控制处理请求的工作线程.
2. event模式:
        支持event模式,需要在编译的时候加上–with-mpm=event即可.event模式由于把服务进程从链接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的负载.event模式为worker开发的变种模式,配置以及指令与worker完全相同.不过event模式不能很好的支持https的访问,有时还会出现一系列的问题.
3. worker模式:
        支持worker模式,需要在编译时候加上–with-mpm=worker即可.worker模式由于使用线程来进行处理请求,所以能够处理海量请求,而系统资源的开销要小于基于进程的服务器.同时worker模式也使用了多进程,每个进程又有着多个线程,以获得基于进程服务器的稳定性.
在编译后的配置文件中../httpd/conf/extra/httpd-mpm.conf配置文件(以下简称httpd-mpm.conf),包含如下内容(其他模式暂不显示):
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17


... ...

# worker MPM

# StartServers: initial number of server processes to start

# MaxClients: maximum number of simultaneous client connections

# MinSpareThreads: minimum number of worker threads which are kept spare

# MaxSpareThreads: maximum number of worker threads which are kept spare

# ThreadsPerChild: constant number of worker threads in each server process

# MaxRequestsPerChild: maximum number of requests a server process serves


    StartServers          2

    MaxClients          150

    MinSpareThreads      25

    MaxSpareThreads      75

    ThreadsPerChild      25

    MaxRequestsPerChild   0


......

         worker的工作原理,启动时建立"StartServers"子进程数,每个子进程中包含"ThreadsPerChild"线程数,随后父进程检测所有子进程中空闲线程的总数,并新建或结束子进程使空闲线程的总数维持在MinSpareThreadsMaxSpareThreads所指定的范围内.由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值.可以并行处理的客户端的最大数量取决于MaxClients指令.活动子进程的最大数量取决于MaxClients除以ThreadsPerChild的值.MinSpareThreadsMaxSpareThreads的最大缺省值分别是75250.用户需按照实际应用情况进行调整.
        ThreadsPerChildworker MPM中与性能相关最密切的指令.ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的.这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:
        #define DEFAULT_THREAD_LIMIT 64

        #define MAX_THREAD_LIMIT 20000
这两行对应着ThreadsPerChildThreadLimit的限制数.最好在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将会自动调节到一个相应值(可能是个非期望值).:
1

2

3

4

5

6

7

8


   StartServers 3

    MaxClients 2000

    ServerLimit 25

    MinSpareThreads 50

    MaxSpareThreads 200

    ThreadLimit 200

    ThreadsPerChild 100

    MaxRequestsPerChild 0

4. prefork模式:
         prefork模式为Unix下缺省模式,即不需使用–with-mpm=MPM即可.prefork为非线程型的、预派子进程模式,prefork没有使用到线程.工作方式类似于apache1.3版本中所采用的模式.perfork模式由于使用单独的子进程来处理每个请求.prefork具有很强的自我调节能力,只需要很少的配置指令调整.所以prefork同时也为最稳定的MPM之一.
         在编译后的配置文件中../httpd/conf/extra/httpd-mpm.conf配置文件(以下简称httpd-mpm.conf),包含如下内容(其他模式暂不显示):
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


......

# prefork MPM

# StartServers: number of server processes to start

# MinSpareServers: minimum number of server processes which are kept spare

# MaxSpareServers: maximum number of server processes which are kept spare

# MaxClients: maximum number of server processes allowed to start

# MaxRequestsPerChild: maximum number of requests a server process serves


    StartServers          5

    MinSpareServers       5

    MaxSpareServers      10

    MaxClients          150

    MaxRequestsPerChild   0


......

        prefork的工作原理是,控制进程在最初建立"StartServers"个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32,直到满足 MinSpareServers设置的值为止.这就是预派生(prefork)的由来.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能.
MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程.这个值不要设得过大,但如果设的值比MinSpareServers,Apache会自动把其调整为 MinSpareServers+1.如果站点负载较大,可考虑同时加大MinSpareServersMaxSpareServers.
MaxRequestsPerChild设置的是每个子进程可处理的请求数.每个子进程在处理了"MaxRequestsPerChild"个请求后将自动销毁.0意味着无限,即子进程永不销毁.虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
可防止意外的内存泄漏;
在服务器负载下降的时侯会自动减少子进程数.
因此,可根据服务器的负载来调整这个值.笔者认为10000左右比较合适.

axClients是这些指令中最为重要的一个,设定的是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.
1

2

3

4

5

6


   StartServers 10

    MinSpareServers 10

    MaxSpareServers 15

    ServerLimit 2000

    MaxClients 1000

    MaxRequestsPerChild 10000

修改后重启时,不能使用 restart,而应该stop然后start,否则serverlimit不生效.

上述配置中,ServerLimit的最大值是2000,对于大多数站点已经足够.如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可:
#define DEFAULT_SERVER_LIMIT 256

#define MAX_SERVER_LIMIT 20000
5.mpmt_os2模式:
   支持mpmt_os2模式,需要编译的时候加上–with-mpm= mpmt_os2即可.mpmt_os2是专门针对OS/2优化过的混合多进程多线程多路处理模块(MPM) .




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-639386-1-1.html 上篇帖子: 第三章 安装apache 下篇帖子: 第五章 apache启动脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表