如何切换apache mpm prefork2的prefork和worker模式

如何切换apache2的prefork和worker模式
ZDNet服务器频道时间:作者: |
本文关键词:
  在Prima/Plesk/Virtuozzo上,apache都使用了系统自带的d-2.0.5x的rpm包
  在redhat linux上,默认使用的是模式,而不是worker模式
  如何在二者间?
  解决方案
  Apache 被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的。
  不同的平台和不同的环境经常产生不同的需求,或是为了达到同样的最佳效果而采用不同的方法。
  Apache凭借它的模块化设计很好的适应了大量不同的环境。
  这一设计使得网站管理员能够在编译时和运行时凭借载入不同的模块来决定的不同附加功能。
  .0将这种模块化的设计延伸到了web的基础功能上。
  这个版本带有多路处理模块(MPM)的选择以处理网络端口绑定、
  接受请求并指派子进程来处理这些请求。
  比如,需要更好伸缩性的可以选择象worker或event这样线程化的MPM,
  而需要更好的稳定性和兼容性以适应一些旧的软件可以用 。
  在Redhat Linux的主要版本as4上,apache版本为d-2.0.5x,
  默认为模式,主要是考虑到稳定性的原因。
  要到worker模式,则需要登录到linux上,进行如下操作:
  进入/usr/sbin目录
  cd /usr/sbin
  将当前的模式启动文件改名
  mv d d.
  将worker模式的启动文件改名
  mv d.worker d
  修改配置文件vi /etc/d/conf/d.conf
  找到里边的如下一段,可适当修改负载等参数:
  StartServers 2
  MaxClients 150
  MinSpareThreads 25
  MaxSpareThreads 75
  ThreadsPerChild 25
  MaxRequestsPerChild 0
  重新启动服务
  /etc/init.d/d restart
  即可换成worker方式启动
  注意:处于稳定性和安全性考虑,不建议更换的运行方式,使用系统默认即可
  另外很多php模块不能工作在worker模式下,例如redhat linux自带的php也不能支持线程安全
  所以最好不要工作模式。
上一篇:下一篇:
的相关文章
的相关文章
今日推荐阅读:
最受关注的文章:
最新更新文章:
本篇文章共有
- 发表评论 -
重磅专题报道
Copyright& 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备号-159京公网安备:Apache Prefork vs Worker MPM - Stack Overflow
to customize your list.
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other.
J it only takes a minute:
Join the Stack Overflow community to:
Ask programming questions
Answer and help your peers
Get recognized for your expertise
Looking at the Apache config file, I see Prefork and Worker MPM defined. What is the difference and which one is Apache using?
2,908113352
Prefork and worker are two type of MPM apache provides. Both have their merits and demerits.
By default mpm is prefork which is thread safe.
Prefork MPM uses multiple child processes with one thread each and each process handles one connection at a time.
Worker MPM uses multiple child processes with many threads each. Each thread handles one connection at a time.
For more details you can visit
and for apache prefork settings you can read following blog
13.7k22846
Take a look at
for more detail. It refers to how Apache handles multiple requests. Preforking, which is the default, starts a number of Apache processes (2 by default here, though I believe one can configure this through httpd.conf). Worker MPM will start a new thread per request, which I would guess, is more memory efficient. Historically, Apache has used prefork, so it's a better-tested model. Threading was only added in 2.0.
17.9k22751
Apache's Multi-Processing Modules (MPMs) are responsible for binding to network ports on the machine, accepting requests, and dispatching children to handle the requests ().
They're like any other Apache module, except that just one and only one MPM must be loaded into the server at any time. MPMs are chosen during configuration and compiled into the server by using the argument --with-mpm=NAME with the configure script where NAME is the name of the desired MPM.
Apache will use a default MPM for each operating system unless a different one is choosen at compile-time (for instance on Windows mpm_winnt is used by default). Here's the list of operating systems and their default MPMs:
mpm_netware
OS/2 mpmt_os2
Unix/Linux
prefork (: prefork, worker, or event, depending on platform capabilities)
Windows mpm_winnt
To check what modules are compiled into the server use the command-line option -l ( is the documentation). For instance on a Windows installation you might get something like:
& httpd -l
Compiled in modules:
mod_win32.c
mpm_winnt.c
http_core.c
As of version 2.2 this is the :
core - Core Apache HTTP Server features that are always available
mpm_common - A collection of directives that are implemented by more than one multi-processing module (MPM)
beos - This Multi-Processing Module is optimized for BeOS.
event - An experimental variant of the standard worker MPM
mpm_netware Multi-Processing Module implementing an exclusively threaded web server optimized for Novell NetWare
mpmt_os2 Hybrid multi-process, multi-threaded MPM for OS/2
prefork Implements a non-threaded, pre-forking web server
mpm_winnt - This Multi-Processing Module is optimized for Windows NT.
worker - Multi-Processing Module implementing a hybrid multi-threaded multi-process web server
Now, to the difference between prefork and worker.
implements a non-threaded, pre-forking web server that handles
requests in a manner similar to Apache 1.3. It is appropriate for
sites that need to avoid threading for compatibility with
non-thread-safe libraries. It is also the best MPM for isolating each
request, so that a problem with a single request will not affect any
implements a hybrid multi-process multi-threaded server and gives better performance, hence it should be preferred unless one is using other modules that contain non-thread-safe libraries (see also
on Serverfault).
5,63682841
You can tell whether Apache is using preform or worker by issuing the following command
apache2ctl -l
In the resulting output, look for mentions of prefork.c or worker.c
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled技术随笔(23)
选择prefork还是worker可以在编译时使用--with-mpm=MPM参数指定,默认为prefork.
1.prefork.c模块(一个非线程型的、预派生的MPM)
prefork采用预派生子进程方式,用单独的子进程来处理 不同的请求,进程之间彼此独立。
在make编译和make install安装后,使用httpd -l来确定当前使用的MPM是prefork.c。
prefork 控制进程在最初建立StartServers个子进程后,为了满足MinSpareServers设置的需要创建一个进程,
等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,
最多达到每秒32个,直到满足MinSpareServers设置的值为止。
这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。
这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。
如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild设置的是每个子进程可处理的请求数。
每个子进程在处理了MaxRequestsPerChild个请求后将自动销毁。0意味着无限,即子进程永不销毁。
虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。
因此,可根据服务器的负载来调整这个值。MaxClients是这些指令中最为重要的一个,
设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。
其缺省&#是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),
那么后面的请求就要排队,直到某个已处理请求完毕。
这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。
虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。
ServerLimit指令无须重编译Apache就可以加大MaxClients。
ServerLimit&& 10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0
2.worker.c模块(支持混合的多线程多进程的多路处理模块)
相对于prefork,worker全新的支持多线程和多进程混合模型的MPM。
由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。
但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。
在configure --with-mpm=worker后,进行make编译、make install安装。
Worker 由主控制进程生成“StartServers”个子进程,
每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。
同样,为了不在请求到来时再生成线程,
MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;
而MaxClients 设置了同时连入的clients最大总数。
如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。
这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。
ThreadsPerChild是worker MPM中与性能相关最密切的指令。
ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。
这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。
Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,
应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。
默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。
需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxClients,
而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值。
ServerLimit 25
ThreadLimit 200
StartServers 3
MaxClients 2000
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:117142次
积分:2175
积分:2175
排名:第12059名
原创:99篇
转载:25篇
(2)(4)(2)(3)(8)(1)(1)(2)(9)(2)(2)(5)(1)(1)(3)(5)(1)(4)(7)(8)(1)(6)(17)(17)(13)(2)jafyoo 的BLOG
用户名:jafyoo
文章数:164
评论数:54
访问量:604648
注册日期:
阅读量:5863
阅读量:12276
阅读量:299402
阅读量:1019521
51CTO推荐博文
空闲子进程:是指没有正在处理请求的子进程。
1、prefork.c模块(一个非线程型的、预派生的MPM)
& & prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并 且对于那些线程调试困难的平台而言,他也更容易调试一些。
ServerLimit& &20000
StartServers& &5
MinSpareServers& &5
MaxSpareServers& &10
MaxClients& &1000
MaxRequestsPerChild 0
ServerLimit& &&&2000
//默认的MaxClient最大是256个线程,假如想配置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。假如需要更大,则必须编译apache,此前都是无需重新编译Apache。
生效前提:必须放在其他指令的前面
StartServers& &5
//指定服务器启动时建立的子进程数量,prefork默认为5。
MinSpareServers& &5
//指定空闲子进程的最小数量,默认为5。假如当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers& &10
//配置空闲子进程的最大数量,默认为10。假如当前有超过MaxSpareServers数量 的空闲子进程,那么父进程将杀死多余的子进程。此参数不要 设的太大。假如您将该指令的值配置为比MinSpareServers小,Apache将会自动将其修改成&MinSpareServers+1&。
MaxClients& &256
//限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,您必须同时增大ServerLimit 。
MaxRequestsPerChild 10000
//每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。假如MaxRequestsPerChild为&0&,子进程将永远不会结束。
将MaxRequestsPerChild配置成非零值有两个好处:
1.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
工作方式:
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或是空闲的子进程 用于迎接即将到来的请求。这样客户端就无需在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于配置子进程的低特权用户。运行子进程的用户必须要对他所服务的内容有 读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。
2、worker.c模块(支持混合的多线程多进程的多路处理模块)
& & worker MPM 使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,假如一个线程崩溃,整个进程就会连同其任何线程一起&死掉&.由于线程共享内存空间,所以一个程式在运行时必须被系统识别为&每 个线程都是安全的&。
ServerLimit& &50
ThreadLimit& &200
StartServers& &5
MaxClients& &5000
MinSpareThreads& &25
MaxSpareThreads& &500
ThreadsPerChild& &100
MaxRequestsPerChild 0
ServerLimit 16
//服务器允许配置的进程数上限。这个指令和ThreadLimit结合使用配置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
ThreadLimit 64
//每个子进程可配置的线程数上限。这个指令配置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。默认值是&64&.
StartServers 3
//服务器启动时建立的子进程数,默认值是&3&。
MinSpareThreads 75
//最小空闲线程数,默认值是&75&。这个MPM将基于整个服务器监控空闲线程数。假如服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads 250
//配置最大空闲线程数。默认值是&250&。这个MPM将基于整个服务器监控空闲线程数。假如服 务器中总的空闲线程数太多,子进程将杀死多余的空闲线 程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正您配置的值:worker需要其大于等于 MinSpareThreads加上ThreadsPerChild的和
MaxClients 400
//允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候 队列。默认值是&400&,16 (ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,您必须同时增加 ServerLimit的值。
ThreadsPerChild 25
//每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild 0
//配置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。假如MaxRequestsPerChild为&0&,子进程将永远不会结束。
将MaxRequestsPerChild配置成非零值有两个好处:
1.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
对于KeepAlive链接,只有第一个请求会被计数。事实上,他改变了每个子进程限制最大链接数量的行为。
工作方式:
每个进程能够拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建 立。每个子进程能够建立 ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。Apache总是试图维持一个备 用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。在Unix中,为了能够绑定80端口,父进程一般都是以 root身份启动,随后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对 其提供的内容拥有读权限,但应该尽可能给予他较少的特权。另外,除非使用了suexec ,否则,这些指令配置的权限将被CGI脚本所继承。
ThreadLimit &= ThreadsPerChild
MaxClients = MinSpareThreads+ThreadsPerChild
ServerLimi和ThreadLimit这两个指令决定了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的)。
Apache在编译ServerLimit时内部有一个硬性的限制,您不能超越这个限制。
prefork MPM最大为&ServerLimit 200000&
其他MPM(包括work MPM)最大为&ServerLimit 20000
Apache在编译ThreadLimit时内部有一个硬性的限制,您不能超越这个限制。
mpm_winnt是&ThreadLimit 15000&
其他MPM(包括work prefork)为&ThreadLimit 20000
使用ServerLimit和ThreadLimit时要特别当心。假如将ServerLimit和ThreadLimit配置成一个高出实际需要许多的值,将会有过多的共享内存被分配。当配置成超过系统的处理能力,Apache可能无法启动,或系统将变得不稳定。
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 prefork worker 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信