Apache worker/prefork模式

Apache worker/prefork模式

查看当前模式:
法1: /application/apache/bin/apachectl -l | sed -n '/worker|profork/p'
法2: /bin/httpd -l|egrep "worker|profork"
法3: /application/apache/bin/apachectl -v

如果apache已经安装,我们可以用"httpd -l"命令查看当前模式。若找到 prefork.c 则表示当前工作在prefork模式,同理出现 worker.c 则工作在worker模式。
如果apache还未安装,我们在编译的时候可以加入 --with-pem=(prefork|worker) 选项决定启用什么模式。

其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式

一、两种模式

prefork模式:

使用的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接
工作原理:
    控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以需求不断创建新的子进程,最大可以达到每秒32个知道满足需求为止。--with-pem=prefork 。默认也是prefork
优点:效率高,稳定,安全,对于线程调试困难的平台来说,调试容易。
确定:和worker比消耗资源多

vi /application/apache/conf/extra/httpd-mpm.conf
找到里边的如下一段,可适当修改负载等参数:

<IfModule mpm_prefork_module>
StartServers 10     #最初建立的子进程
MaxClients 1500     #设定的是apache可以同时处理的请求,是对apaceh性能影响最大的参数。即Apache可以同时处理的请求数。如果有150个用户在访问,那么151个必须等到访问结束才可以访问
MinSpareServers 10  #最小空闲进程数,如果空闲进程小于设定值,Apache会自动建立进程。如果服务器并发及负载大的话,可以考虑加大
MaxSpareServers 15  #最大空闲进程数,如果空闲进程大于设定值,Apache会自动kill进程。如果服务器并发及负载大的话,可以考虑加大
MaxRequestsPerChild 5000    #每个子进程可以处理的请求数。每个子进程在处理了maxrequestsperchild 个请求后将自动销毁。0表示无限,即子进程永不销毁。0可以使每个子进程处理更多的请求。但如果设成非零也有以下两点好处:1.可以防止意外的内存泄露2.在服务器负载下降的时候回自动减少子进程数
</IfModule>

worker模式:

worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接

优点:内存占用量比较小,适合高流量的http服务器。
缺点:是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,由于线程共享内存空间,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。稳定性不如prefork

此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。


修改Apache配置文件
vi /application/apache/conf/extra/httpd-mpm.conf
找到里边的如下一段,可适当修改负载等参数:


StartServers          2
MaxClients          150
MinSpareThreads      25
ThreadLimit         200
MaxSpareThreads      75 
ThreadsPerChild      25
ServerLimit         2000
MaxRequestsPerChild   0

详解:
<IfModule mpm_worker_module>
StartServers 10     #服务器启动时一次建立的子进程数量
MaxClients 1500     #设定apache同一时间处理的最大请求数量,这里是指最大线程数量,大小仍受ServerLimit限制且必须是ThreadsPerChild的倍数。
MinSpareThreads 10  #设置最少的空闲线程数
MaxSpareThreads 15  #设置最大的空闲线程数,必须大于等于MinSpareThreads加上ThreadsPerChild的和(因为每个子进程拥有的线程数是固定的)
ThreadsPerChild 150     #每个子进程建立的常驻线程,之后不会再创建新的线程。大小受ThreadLimit限制
MaxRequestsPerChild 5000    #每个子进程可以处理的请求数。每个子进程在处理了maxrequestsperchild 个请求后将自动销毁。0表示无限,即子进程永不销毁。0可以使每个子进程处理更多的请求。但如果设成非零也有以下两点好处:1.可以防止意外的内存泄露2.在服务器负载下降的时候回自动减少子进程数
ServerLimit:服务器允许配置的进程数上限,和ThreadLimit共同限制MaxClients(MaxClients <= ServerLimit * ThreadsPerChild)。

ThreadLimit:TreadsPerChild可以配置的线程数上限,默认为64。
</IfModule>

worker模式下所能同时处理请求的总数是由子进程总数乘以ThreadsPerChild值决定的,应该>=maxclients.如果负载很大。子进程不能满足时,控制进程会派生新的子进程。默认的子进程是16.如需加大也需显示声明serverlimit的值(最大20000)

说明:如果声明了ServerLimit,那么它乘以ThreadsPerChild>=maxClients。而且MaxCLient必须是ThreadsPerChild的整数倍。否则Apache会自动调节到一个相应值。
maxclient % ThreadsPerChild=o

三、prefork和worker模式的比较

prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。

worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉"。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。

总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker

默认情况下,Linux下的Apache是prefork模式,切换成worker模式步骤如下:

prefork和worker模式的切换

1.将当前的prefork模式启动文件改名

mv httpd httpd.prefork

2.将worker模式的启动文件改名

扫描二维码关注公众号,回复: 1578160 查看本文章

mv httpd.worker httpd

3.修改Apache配置文件

vim /usr/local/apache2/conf/extra/httpd-mpm.conf

网友评论:

for redhat
在 /etc/sysconfig/httpd 打开 #HTTPD=/usr/sbin/httpd.worker 的注释

请教 .mpm_worker +mod_php 有在用到生产么?

worker mpm一般不会跟mod_php搭配,worker mpm一般都是跟apache的mod_fcgid 搭配,然后PHP要安装php-cgi 来跑PHP的。

猜你喜欢

转载自blog.csdn.net/shangyuanlang/article/details/77970738