Apache的工作模式prefork & worker简单分析
来源:互联网 发布:途观丝绸之路 知乎 编辑:程序博客网 时间:2024/06/05 09:46
前言:
有两种方式可以查看apache的工作模式,一是通过查看./build/config.nice文件,这个文件时编译的参数,编译的时候是什么模式,那么apache就是什么模式,如果要改变的话,那么就需要重新编译,如下:
点击(此处)折叠或打开
- #! /bin/sh
- #
- # Created by configure
- "./configure" \
- "--prefix=/home/sjg/lamp/apache" \
- "--enable-so" \
- "--enable-cgi" \
- "--enable-module=rewirte" \
- "$@"
点击(此处)折叠或打开
- ......
- prefork.c
- ......
其中有prefork.c,说明apache的工作模式是prefork。
1、介绍:
Apache2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。
MPM:Multi-ProcessingModules,多道处理模块
在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中。
指定mpm的方法:
./configure --help | grep mpm
--with-mpm=MPM Choose theprocess model for Apache to use.
MPM={beos|event|worker|prefork|mpmt_os2|winnt}
我只看了prefork和worker两种,在网上查资料说,其他的mpm不安全,不推荐使用。
2、prefork & worker
prefork的工作原理及配置
如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式,没有用到线程,进程彼此之间相互独立,这也是mpm之所以稳定的原因之一。
使用
bashapachectl -l
或者
./httpd-l
查看是否为prefork.c模式
如果是worker.c的话,就是worker模式
Apache 2.2.23版本中的默认配置是
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestsPerChild 0
一个配置:
StartServers 20
MinSpareServers 10
MaxSpareServers 30
MaxClients 512
MaxRequestsPerChild 1000
3、prefork工作原理:
(1)控制进程在最初建立StartServers个进程;
(2)为了满足MinSpareServers设置,则等待1秒钟,继续创建2个进程,再等待1秒钟,创建4个进程......如此指数级的创建进程,最多达到每秒创建32个进程(这种方式,可以在请求没有来之前,提前创建好进程,避免请求到来之时创建进程带来的系统开销,这也是预派生的由来);如果kill掉一个子进程之后,就会等待一秒钟,然后创建一个进程。
(3)MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers;
(4)MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:可防止意外的内存泄漏;在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。
因此,httpd那些进程都是最近才启动的
(5)MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grephttp|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制是256(2.2.3最大限制也是256)。如果把这个值设为大于256,那么Apache将无法起动(我测试的结果是可以启动的)。事实上,256对于负载稍重的站点也是不够的。
(6)ServerLimint是当MaxClients在最大值仍然不够用的时候,可以使用此选项。2.2.23中,默认的ServerLimit是200000,可以在server/mpm/prefork/prefork.c中修改一个宏定义。
4、测试结果:
1)启动之后的进程数是:
StartServers min
MinSpareServers start
MaxSpareServers start>max
实际还需要加1个进程,多了一个控制进程
2)MaxSpareServers不论配置的多少,至少要是MinSpareServers+1个
3)测试的时候StartServers最大值是150,超过这个值是徒劳的,而且当StartServers的值大于MaxSpareServers的时候,将会自己kill掉,直到MaxSpareServers为止。
5、worker工作原理
支持多线程和多进程的混合模型的MPM,由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。
MinSpareThreads:最少空闲线程
MaxSpareThreads:最多空闲线程
MaxClients:所有线程的总和
ThreadLimit:如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程,默认最大值是16,可以通过此选项显式增大
注:
Worker模式的还没有测试,关于MaxClients的最优值,自己还没有想清楚;另外,worker模式的参数也没有验证和测试,我后续测试一下,给大家补充上,部分内容参考网上资料。
上一篇:Kill -HUP详解
下一篇:负载均衡算法小结
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
xiquyila2014-12-01 10:50:17
楼主,请问一下,apache 在MPM下的 负载均衡的算法是怎么实现的, 比如必要的共享机制、每个请求由哪个进程、线程响应等等?
- Apache的工作模式prefork & worker简单分析
- [转贴]apache的prefork和worker工作模式
- Apache工作模式prefork和worker的比较
- Apache工作模式prefork和worker的比较
- apache的工作模式prefork和worker理解
- Apache 的三种工作模式(Prefork、Worker、Event)
- apache常用的两种工作模式prefork和worker
- apache工作模式:prefork和worker
- apache工作模式:prefork和worker
- apache工作模式:prefork和worker
- Apache worker/prefork模式
- Apache的prefork模式和worker模式
- Apache的prefork模式和worker模式
- Apache的prefork模式和worker模式
- Apache的prefork模式和worker模式
- Apache的prefork模式和worker模式
- Apache的prefork模式和worker模式
- Apache的prefork模式和worker模式
- ACM刷题之ZOJ————How Many Nines
- top 命令详解
- HTTP Cache
- android的MediaPlayer架构介绍
- Kill -HUP详解
- Apache的工作模式prefork & worker简单分析
- 数学之线性代数——正交分解
- JDK、JRE、JVM之间的联系
- python re正则模块
- 负载均衡算法小结
- 解决问题的思想
- Linux查看进程的所有子进程和线程
- iptables详解
- vim ide 环境搭建