总结:访问量大的时候使用

worker模式:  每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高。

prefoek模式 : 每个子进程只有一个线程,一次请求一个进程。

什么是apache的工作模式?

个人理解:apache的工作模式就是apache在运行时候的内存分配,进程和线程的使用方式。举个例子:一台apache正在运行的服务器,如果有个用户访问这个apache,那么apache是启用一个进程来处理用户的请求呢?还是在已有的进程中启用一个线程来处理该用户的请求?这个选择就是 apache的工作模式来确定的。如果指定了某个工作模式比如prefork模式,那么每个用户的请求就要启用一个进程来处理。

apache有几种工作模式?怎么查看和修改apache的工作模式?

apache的工作模式有:beos,event,worker,prefork,mpmt_os2。

在linux(centos)下使用#http –l 命令可以查看当前使用的工作模式。也可以使用#apachectl -l命令。

#http –l

#apachectl –l

看到的prefork.c,说明使用的prefork工作模式。

可以在编译的时候使用#–with-mpm=prefork对应的工作模式名称来修改工作模式。

beos工作模式(跟linux关系不大,或者暂时用不上)

在Beos系统上的工作模式,使用一个单独的控制线程来创建和控制处理请求的工作线程。

event工作模式(不太稳定,或者说暂时用不上)

event模式由于把服务进程从链接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的负载。event模式为 worker开发的变种模式,配置以及指令与worker完全相同。不过event模式不能很好的支持https的访问,有时还会出现一系列的问题。

worker工作模式(与php配合不好,或者说暂时用不上)

worker模式由于使用线程来进行处理请求,所以能够处理海量请求,而系统资源的开销要小于基于进程的服务器。同时worker模式也使用了多进程,每个进程又有着多个线程,以获得基于进程服务器的稳定性。

mpmt_os2工作模式(很少用,或者说暂时用不上)

mpmt_os2是专门针对OS/2优化过的混合多进程多线程多路处理模块(MPM) 。

prefork工作模式(本篇文章的主角,使用最多而且最稳定的工作模式)

prefork工作模式是linux下apache安装时候的默认工作模式,是使用最普遍的工作模式。为了能够简单的明白他的工作原理,下面是一个假设:

有一台正在运行的apache服务器,用户A访问该apache的时候apache建立一个新的进程1处理用户A的请求。

这时又有一个用户B访问该apache,apache又建立一个新的进程2处理用户B的请求。

后来又有用户C,D,E访问该apache,apache又建立三个进程3,4,5处理他们的请求。

如果每当一个新用户访问该apache,apache再建立一个新的进程处理用户的请求,是不是太慢了呢?

所以apache的prefork模式在apache第一次启动的时候就建立5个进程,等待用户的连接请求,有一个用户访问,就有一个进程处理他的请求。

那么如果有5个用户同时访问apache,apache第一次建立的5个进程全部用光了,所以apache就再从新在建立5个进程,等待下一批用户的请求。

prefork模式会根据服务器的硬件情况,设定apache最多只能同时建立256个进程。再多的请求就只能等待前面的进程处理完毕在进行处理。

假设完毕!

上面的假设就是prefork模式的工作原理。但是上面假设中具体的数字不是定死的,而是通过prefork模式的配置来设置的。下面是http.conf中的配置信息。

*带井号的为注释部分

prefork模式的几个重要的参数:

名称 默认值    说明

StartServers   5    apache启动时候默认开始的进程数

MinSpareServers   5    最小的闲置进程数

MaxSpareServers   10    最大的闲置进程数

ServerLimit   256    最大的进程总数(参考,实际看MaxClients)

MaxClients   256    最大的进程总数

MaxRequestsPerChild   4000    每个进程处理的最多请求数

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个请求就要关闭这个进程呢?答案之一:为了防止内存的泄露。

下面图文介绍这些参数(要深刻理解一个知识就要亲自去体验)

测试环境参数   说明

操作系统   centos4.5(虚拟机)

服务器   apache2.2.6

内存   1G

服务器地址   192.168.212.128

客户端地址   192.168.212.1

测试文件index.php

<?php
for($i = 0;$i <= 10;$i++){
	echo date('H:i:s',time());
	echo '<br/>';
	sleep(10);
}
?>

测试http.conf的prefork模式设置:(设置有点极端,但是可以很好的理解说明)

首先查看apache第一次启动时候的空闲进程:

linux(centos)下查看apache的进程可以使用#ps -ef|grep httpd命令,查看apache进程的内存使用情况可以使用#ps –U apache –u apache u命令

#service httpd restrat:重启apache,初始化进程

#ps -ef|grep httpd:用户名为apache的才是apache用于处理用户请求的进程

#ps –U apache –u apache u:查看用户名为apache的进程(即apache为了处理用户请求而建立的进程详情)

当前为没有任何用户访问时候apache建立StartServers=1个进程

当有一个用户访问(通过本机上的ie浏览器访问虚拟主机上apache服务器模式该情景)

可以看到apache的进程增加为2个,为什么呢?当唯一的空闲进程时候完之后,空闲进程小于MinSpareServers,apache就从新建立一个进程。注意查看RSS值(该进程的内存使用量KB)为4424的空闲进程。

再看看访问完成之后的apache进程数。

可以看到还是只有两个进程,而且这两个进程都是空闲的。

当有两个用户访问(通过本机上的两个ie浏览访问虚拟主机上的apache服务器模拟该情景)

可以看到有两个用户访问的时候apache的进程数增加为3个。为什么呢?当本来空闲2个进程时候完之后,空闲进程小于MinSpareServers,apache就从新建立一个进程。注意查看RSS值(该进程的内存使用量KB)为4424的空闲进程。

再看看访问完成之后的apache进程数。

可以看到空闲的进程数又减少为2个。为什么呢?当两个用户访问完成之后两个用户的进程都会关闭,这时候就会有3个空闲进程,这个值大于MaxSpareServers=2的值。所以apache会自动关掉一个进程满足MaxSpareServers=2的值。

当有三个用户同时访问(通过本机上的三个ie浏览访问虚拟主机上的apache服务器模拟该情景)

可以看到apache的进程有3个,而这三个进程都在处理用户的请求,没有多余的空闲进程产生。为什么呢?因为在上面我们设置了MaxClients的值为3。所以apache最多只会生成3个进程。

再看看这三个用户访问完成之后的apache进程数。

可以看到空闲的进程数又减少为2个。为什么呢?当三个用户访问完成之后三个用户的进程都会关闭,这时候就会有3个空闲进程,这个值大于MaxSpareServers=2的值。所以apache会自动关掉一个进程满足MaxSpareServers=2的值。

当有四个用户同时访问(通过本机上的四个ie浏览访问虚拟主机上的apache服务器模拟该情景)

可以看到虽然有四个用户同时访问,但是apache创建的进程数还是只有3个。就是说apache只对前面的3个用户请求进行了处理。第4个用户只能等待。

这个时候查看apache的TCP连接情况。(对于TCP连接不太理解的可以点击查看

可以看到这4个用户都已经建立了连接。但是apache只处理了前面的3个请求。处理完3个请求在处理最后一个请求,这点可能从文件的打印内容看到。四个用户几乎是同时访问的。

可以看到最后一个用户的请求时间是前面三个用户访问完成之后开始的。

依次类推,当有7个用户同时访问时候又是什么样的?只贴几张图,看了就明白了。

结论

如果从头到尾详细读过本篇文章,会得出如下的结论:

1,apache是严格按照prefork模式的配置参数来进程分配和管理的。不像网上有些文章那样修改了某个值,apache不起作用。只能说您改的不对,或者说您对上面的内容还不够理解。

2,MaxClients值就是apache的最大进程数。不像网上有些文章说的这个值越大越好(有的文章既然推荐该值为4000),您可以从上面的进程图中看到apache的每个进程的%MEM(内存占用百分比)值为0.5%左右。所以这个值的具体设置的最大数位:100/0.5 = 200。而这也只是在这个服务器只有一个apache的情况下。如果服务器有其他程序需要占用内存(比如mysql)这个值要小于200。你总不能把操作系统的所有内存都给apache吧?

3,每个浏览器是一个用户,每个用户就是一条进程。明白意思了吧?我的这台服务器的并发量只有200。就是说我的这台服务器只能支持同时200个用户访问,再多的用户访问就只能是等待。或者说我这台服务器只支持200个浏览器的访问。关于服务器的并发我会在下面一片文章中详细讲解。

4,200的并发量很小吗?要知道apache处理数据的速度是相当快的。一条正常的首页访问可能就一秒钟处理完毕。所以在假想的状态下,我的这台服务器,每分钟可以访问60*200=12000个用户。每天可以访问12000*60*24=17280000个用户的访问。这当然是在完全饱和的访问状态的假想数据。下一篇文章我会详细讲解网站并发,请求,连击等内容。

5,如果访问的用户数大于MaxClients的数,多出的用户不会立刻断掉连接,还是会建立TCP连接。只不过会等待前面的用户处理完在得到相应。在php.ini,http.conf,操作系统设定的超时时间内得不到相应才会断掉连接。

apache 的工作模式的更多相关文章

  1. apache常用工作模式的区别

    apache常用工作模式有两种 worker模式1.线程模式2.占用资源少3.稳定性略差4.并发大 prefork模式1.进程模式2.占用资源多3.稳定4.并发一般  来自为知笔记(Wiz)

  2. apache的工作模式 和 最大连接数设置

    经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...

  3. apache查看工作模式及调优

    一,查看工作模式 /usr/sbin/httpd -l Compiled in modules:  core.c  prefork.c  http_core.c  mod_so.c 如果出现prefo ...

  4. (转载)关于Apache 的两种工作模式

    今天在查看服务器的时候,发现服务器http请求数 每天增长越来越多,在优化集群服务器的时候,查看到Apache 的工作模式是prefork,于是想到了worker 模式, 想暂时的把当前运行模式改成w ...

  5. Apache的三种工作模式

    Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. 它们分别是prefork,worker和event,它们同时也代表这Apac ...

  6. apache工作模式

    查看当前apache的工作模式 apachectl -l prefork模式 <IfModule prefork.c>StartServers 5MinSpareServers 5MaxS ...

  7. Apache三种工作模式详解

    Apache HTTP服务器被设计为一个强大的.灵活的能够在多种平台以及不同环境下工作的服务器.这种模块化的设计就叫做“多进程处理模块”(Multi-Processing Module,MPM),也叫 ...

  8. Apache常用2种工作模式prefork和worker比较

    Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...

  9. apache工作模式:prefork和worker

    apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...

随机推荐

  1. 如何才能恢复Excel文档的打开密码

    对于一些密码的破解,最常用的方法就是“暴力破解”,也是获取密码的最后一种方法,Advanced Office Password Recovery的暴力破解能够破解复杂的Office文档密码.wps也有 ...

  2. 【CodeForces 589F】Gourmet and Banquet(二分+贪心或网络流)

    F. Gourmet and Banquet time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  3. bzoj4415&&bzoj4416&&bzoj4417:SHOI2013Day1题解

    这场题好弱啊qwq 先发代码再填坑 坑已填qwq T1 bzoj4415 题目大意就是,有一个环,编号1-N,一开始指针在1,有一个长度为n的序列p,每次指针向后移pi个,然后把那个点删掉. 问所有点 ...

  4. GCD详解

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...

  5. [bzoj1010][HNOI2008]玩具装箱

    Description 有个物品,每个物品长度为,现在要把这个物品划分成若干组,每组中的物品编号是连续的,规定每组的长度,费用为,求最小费用. Input 第一行输入两个整数和,接下来行输入. Out ...

  6. js-FCC算法-No repeats please字符串的全排列

    把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba ...

  7. pip卡住不动的解决方案

    用的是anaconda2,也就是python在windows下的最好的一键安装包,有numpy scipy matplotlib等常用包预装好了 最近搞caffe的python接口,需要装protob ...

  8. ecshop /includes/lib_base.php、/includes/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php Backdoor Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECShop是国内一款流行的网店管理系统软件,其2.7.3版本某个补丁存 ...

  9. 添加一个功能Action

    1,只用一个handler类,所有都事件的处理器都在一个handler类 handler要创建以Action为名称的方法 event要单独分开,继承KDEvent package com.kingde ...

  10. [JavaEE]调用Restful Service 出现415 Unsupported Media Type的问题(Rest Request Header中的Content-Type问题)

    用Chrome的插件Simple REST Client 调用POST的REST服务时,老是报415错误,如图. 一开始就以为是服务端的问题,各种google,百度,折腾了一下午未果. 晚上继续看,一 ...