- 论坛徽章:
- 0
|
个人认为在这篇官方文档中我们需要注意下面几个地方:
1,它的工作方式类似于Apache 1.3
2,它是要求将每个请求相互独立的情况下最好的MPM
3,最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰
4,Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求
5,一般的网站不需要调整这些指令的默认值
6,可能需要处理最大超过256个并发请求的服务器可能需要增加MaxClients的值
7,Apache产生的子进程通常以一个低特权的用户运行
8,MaxRequestsPerChild指令控制服务器杀死旧进程产生新进程的频率
好了,下面我们一起设置一下perfoke的mpm,共同讨论这些选项的配置问题.
以下内容来自FreeBSD系统ports方式安装的apache22位于/usr/local/etc/apache22/extra/httpd-mpm.conf文件:
# 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
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
1,StartServers: number of server processes to start
StartServers指令
说明服务器启动时建立的子进程数
语法StartServers number
默认值参见下面的说明
作用域server config
状态MPM
模块mpmt_os2, prefork, worker
StartServers指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
不同的MPM默认值也不一样。对于worker默认值是"3"。对于prefork默认值是"5",mpmt_os2是"2"。
2,MinSpareServers: minimum number of server processes which are kept spare
MinSpareServers指令
说明空闲子进程的最小数量
语法MinSpareServers number
默认值MinSpareServers 5
作用域server config
状态MPM
模块prefork
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。
只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
参见
3,MaxSpareServers: maximum number of server processes which are kept spare
MaxSpareServers指令
说明空闲子进程的最大数量
语法MaxSpareServers number
默认值MaxSpareServers 10
作用域server config
状态MPM
模块prefork
MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。
参见
4,MaxClients: maximum number of server processes allowed to start
MaxClients 指令
说明允许同时伺服的最大接入请求数量
语法MaxClients number
默认值参见下面的说明
作用域server config
状态MPM
模块beos, prefork, worker
MaxClients指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令限制的最大值为止。一旦一个链接被释放,队列中的请求将得到服务。
对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量,默认值是256。要增大这个值,你必须同时增大ServerLimit 。
对于线程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用于伺服客户端请求的最大线程数量。线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。
5,MaxRequestsPerChild: maximum number of requests a server process serves
MaxRequestsPerChild指令
说明每个子进程在其生存期内允许伺服的最大请求数量
语法MaxRequestsPerChild number
默认值MaxRequestsPerChild 10000
作用域server config
状态MPM
模块mpm_netware, mpm_winnt, mpmt_os2, prefork, worker
MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。
不同的默认值在mpm_netware和mpm_winnt上的默认值是"0"。
将MaxRequestsPerChild设置成非零值有两个好处:
- 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。
OK,看过官方的说明后我们一起来看看用户的实战经验是怎么说的(注意以下内容仅供参考):
prefork的工作原理及配置
如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
若使用prefork,在make编译和make install安装后,使用“httpd -l”来确定当前使用的MPM,应该会看到prefork.c(如果看到worker.c说明使用的是worker MPM,依此类推)。再查看缺省生成的httpd.conf配置文件,里面包含如下配置段:
<IfModule prefork.c>;
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>;
prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
◆ 可防止意外的内存泄漏;
◆ 在服务器负载下降的时侯会自动减少子进程数。
因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。
MaxClients是这些指令中最为重要的一个,设定的是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。下面是笔者的prefork配置段:
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>
本人建议:
1,可视服务器负载的轻重来调整StartServers,正如官方文档中所说的,如果我们没有特殊需求,不需要更改这个值,默认的5已经能满足大部分人的需求了.
2,对于MinSpareServers 和 MaxSpareServers你需要算一笔账了.MaxRequestsPerChild决定了每自进程接收到多少请求后被杀掉,假设StartServers的值为5,根据perfoke的指数级线程增长机制,MaxSpareServers*MaxRequestsPerChild便是服务器线程峰值的处理请求能力.当然这并不完全准确,但完全可以作为一个可行的参考.
3,对于MaxClients的更改需要非常慎重,你可以采取ps -ef|grep http|wc -l的"偏方"来查看你的应用环境对于这一参数的要求,当然,改动系统源代码来增大这一值的行为被认为是非常不理智的,在你确实感觉因为此参数而导致运行效率低下时可以尝试稍微增大此值并观察效果,直到调整为一恰当的值.
4,正如官方文档中所说的,MaxRequestsPerChild的值如果非零是很有好处的,而在默认安装的apache22中此值的默认值为0,所以如果你决心想做点什么优化的话,加大这个值通常是一个明智的选择,但同样的问题是,盲目的加大任何一个选项的值都是不理智的行为.
------------------------------------------------
[ 本帖最后由 bestwc 于 2007-10-29 14:46 编辑 ] |
|