Apache服务器中prefork和worker工作模式的区别以及性能优化

作者&投稿:揣岚 (若有异议请与网页底部的电邮联系)
判断apache的工作模式是prefork模式还是worker模式~

apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式
一、两种模式
prefork模式:
prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
worker模式:
worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。

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

b. 将worker模式的启动文件改名
mv httpd.worker httpd

c. 修改Apache配置文件
vi /usr/local/apache2/conf/extra/httpd-mpm.conf

找到里边的如下一段,可适当修改负载等参数:


StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0


d. 重新启动服务
/usr/local/apache2/bin/apachectl restart

处于稳定性和安全性考虑,不建议更换apache2的运行方式,使用系统默认prefork即可。另外很多php模块不能工作在worker模式下,例如redhat linux自带的php也不能支持线程安全。所以最好不要切换工作模式。

三、prefork和worker模式的比较
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉"。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。
总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

prefork: 这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。

worker : 此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,假如一个线程崩溃,整个进程就会连同其任何线程一起"死掉".

1、RedHat Linux下查看apache版本号
在Apache安装目录bin下,使用以下命令查看即可。
使用命令:./httpd -v
示例:

2、查看Apache当前工作模式

Apache有prefork和worker工作模式

使用命令:./apachectl –l

示例:

 从以上结果可知,当时httpd工作在prefork模式下。

在configure时,可以通过指定参数,将工作模式设置为worker模式或prefork模式。

使用命令:./configure --with-mpm=worker

示例:设置为worker模式

Apache服务的两种工作模式详解:

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>

  上述配置中,ServerLimit的最大值是2000,对于大多数站点已经足够。如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可:

#define DEFAULT_SERVER_LIMIT 256

#define MAX_SERVER_LIMIT 2000

worker的工作原理及配置

  相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。

  在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:

<IfModule worker.c>

StartServers 2

MaxClients 150

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0

</IfModule>

  worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

  MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

  ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

#define DEFAULT_THREAD_LIMIT 64

#define MAX_THREAD_LIMIT 20000

  这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。

  Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:

#define DEFAULT_SERVER_LIMIT 16

#define MAX_SERVER_LIMIT 20000

  需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是worker配置段:

<IfModule worker.c>

StartServers 3

MaxClients 2000

ServerLimit 25

MinSpareThreads 50

MaxSpareThreads 200

ThreadLimit 200

ThreadsPerChild 100

MaxRequestsPerChild 0

</IfModule>

  通过上面的叙述,可以了解到Apache 2.0中prefork和worker这两个重要MPM的工作原理,并可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。




php+mysql的源码在本地怎么调试啊?
既然用了WP总不能动不动就在服务器调试程序吧~这是很危险的行为。于是我开始了漫长的搜寻之路。哈哈哈~想当的不错我找到了phpStudy这个程序,一次性安装,无须配置即可使用,是非常方便。该程序包集成最新的pache+PHP+MySQL+phpMyAdmin+ZendOptimizer。当然要想用的得心应手还是要做些配置的。这个软件...

proftp和proftpd有什么区别,说的是一个概念吗?
proftp和proftpd是一个概念。ProFTPD是一个Unix平台上或是类Unix平台上(如Linux, FreeBSD等)的FTP服务器程序,任何人只要遵守GPL版权声明,都可以随意修改源始码。ProFTPD的主要包括如下特点:1、单一主设置文件,包含许多指令以及其支配的组pache Web Serve的设置。2、每个目录都可以定义一个".ftpaccess"...

谁有Apache 服务器的配置详细介绍
在使用子进程处理HTTP请求的Web服务器上,由于要首先生成子进程才能处理客户的请求,因此反应时间就有一点延迟。但是,Apache服务器使用了一个特殊技术来摆脱这个问题,这就是预先生成多个空余的子进程驻留在系统中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。在运行中随着客户...

Apache功能?下载使用的网址?
模块可以静态连接到pache 服务器内部,也可以这样动态加载,将Apache的特性都编译成动态可加载模块是该Port的做法,而不是Apache的缺省做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。 因而动态可加载的能力还是对性能有轻微的影响,因此可以重新编译Apache,将自己所需要的功能编译进Apache 服务器内部,可以让系统...

Apache是什么软件? 有什么好处和坏处??? 急!!! 谢谢
Apache是一个历史悠久并且功能十分强大的WEB服务器,但其丰富的功能对于一个新手来说往往不知道从何下手。我个人感觉Apache的设计充分体现了模块化设计的优势,通过在动态模块加载(DSO)模式下的安装,任何子应用模块都可以通过配置文件的简单修改进行积木式的灵活配置。安装的过程可以从简单的静态html服务开始...

跪求..在windows系统下怎样使用apache?
模块可以静态连接到pache 服务器内部,也可以这样动态加载,将Apache的特性都编译成动态可加载模块是该Port的做法,而不是Apache的缺省做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。 因而动态可加载的能力还是对性能有轻微的影响,因此可以重新编译Apache,将自己所需要的功能编译进Apache 服务器内部,可以让系统...

Apache+PHP+MySQL是什么
Apache:是一种web服务器(与IIS类同)PHP:全称为Hypertext Preprocessor。PHP是一种HTML 内嵌式的语言,是一种网站(网页)开发语言(与ASP、JSP、.NET等类同)MySQL:是一种数据库(与SQLServer等类同)要访问网页就需要Web服务器,MySQL用来存放用户与网页之间交互信息的数据。三者结合起来简称AMP,现在...

如何在Linux中配置WWW服务器?
因此为了正常运行服务器便需要设置好这三个文件。除了这三个设置文件之外,Apache还使用mime.types文件用于标识不同文件对应的MIME类型, magic文件设置不同MIME类型文件的一些特殊标识,使得Apache 服务器从文档后缀不能判断出文件的MIME 类型时,能通过文件内容中的这些特殊标记来判断文档的MIME类型。bash-2...

在Linux中,如何配置WWW服务器?
服务器将由其本身启动,并驻留在主机中监视连接请求。在Linux下将在启动文件 \/etc\/rc.d\/rc.local\/init.d\/apache中自动启动Web服务器,这种方式是推荐设置。 启动Apache服务器的另一种方式是inet方式,使用超级服务器inetd监视连接请求并启动服务器。当需要使用inetd启动方式时,便需要更改为这个设置,并屏蔽\/etc\/rc.d...

web服务器
我要介绍一个不使用应用程序服务器的情景和一个使用应用程序服务器的情景。观察一下这两中情景的不同会有助于你了解应用程序服务器的功能。 情景1:不带应用程序服务器的Web服务器 在此种情景下,一个Web服务器独立提供在线商店的功能。Web服务器获得你的请求(request),然后发送给服务器端(server-side)可以处理...

荔湾区13247555806: apache prefork.c 干什么用的
僪鸣敏迪: prefork.c模块(一个非线程型的、预派生的MPM) prefork MPM 使用多个子进程,每个子进程只有一个线程.每个进程在某个确定的时间只能维持一个连接.在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,不过内存使用大得多...

荔湾区13247555806: apache怎么从worker切换为prefork -
僪鸣敏迪: 在Redhat Linux的主要版本as4上,apache版本为httpd-2.0.5x,默认为prefork模式,主要是考虑到稳定性的原因.要切换到worker模式,则需要登录到linux上,进行如下操作:进入/usr/sbin目录 cd /usr/sbin 将当前的prefork模式启动文件...

荔湾区13247555806: Apache服务器中prefork和worker工作模式的区别以及性能优化 -
僪鸣敏迪: 1、RedHat Linux下查看apache版本号 在Apache安装目录bin下,使用以下命令查看即可.使用命令:./httpd -v 示例:2、查看Apache当前工作模式 Apache有prefork和worker工作模式 使用命令:./apachectl –l 示例:从以上结果可知,当时httpd...

荔湾区13247555806: apacheweb服务器有几种工作模式 -
僪鸣敏迪: 三种工作模式,Prefork MPM(一个求)、Event MPM(一个监听进程,一堆处理进程(多线程处理)).以上定义并非准确,具体可以去看Apache的官方文档 推荐多看看《Linux就该这么学》这本书的网站,上面很多有用的资料,多搜集多看资料对你学习Linux有帮助的.

荔湾区13247555806: apache在prefork模式下可以处理多少个进程
僪鸣敏迪: 这个是apache prefork模式默认配置: ServerLimit 256 StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 256 MaxRequestsPerChild 0 ServerLimit 默认的MaxClient最大是256个线程,如果想设置更大的值,就的加上ServerLimit这个参数.20000是ServerLimit这个参数的最大值.如果需要更大,则必须编译apache,此前都是不需要重新编译Apache. 参考:PHP程序员,雷雪松的个人博客--www.leixuesong.cn.

荔湾区13247555806: linux mpm模式用prefork好还是worker好 -
僪鸣敏迪: linux mpm模式用prefork好还是worker好 apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一、两种模式 prefork模式:prefork是Unix平台上的默认(缺...

荔湾区13247555806: 怎么查看服务器安装好了 prefork -
僪鸣敏迪: 1、RedHat Linux下查看apache版本号 在Apache安装目录bin下,使用以下命令查看即可. 使用命令:./httpd -v 示例: 2、查看Apache当前工作模式 Apache有prefork和worker工作模式 使用命令:./apachectl –l 示例: 从以上结果可知,当时httpd...

荔湾区13247555806: 判断apache的工作模式是prefork模式还是worker模式 -
僪鸣敏迪: 进入apache的bin目录下,执行./httpd -l ,看出来是 worker.c文件还是prefork.c文件即是对应的模式.

荔湾区13247555806: apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式?( -
僪鸣敏迪: 空闲子进程:是指没有正在处理请求的子进程.1、prefork.c模块(一个非线程型的、预派生的MPM) prefork MPM 使用多个子进程,每个子进程只有一个线程.每个进程在某个确定的时间只能维持一个连接.在大多数平台上,Prefork MPM在...

荔湾区13247555806: 如何在apache中设置每个连接的最大请求数 -
僪鸣敏迪: 这样就能保证在个连接中如果同时请求数达到100就不再响应这个连接新请求保证了系统资源不会被某个连接大量占用但是在实际配置中要求尽量把这个数值调高来获得较高系统性能

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网