apache 的工作模式 - (work模式)

虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的 Web 服务器的效率最高,但功能简单。例如Unix 平台上的thttpd 就是这样的一种服务器,然而由于它提供的功能少,只能是满足少部分人的需要。即便如此,thttpd 每隔一段时间还会出现一些问题,幸运的是,它出问题时从不是进入死循环,而是被操作系统杀死,这样就可以使用一个shell 循环立即重启动thttpd,从而基本不影响Web 服务。

由于多线程方式使用线程进行任务调度,这样服务器的开发由于遵从标准,从而变得简单并有利于多人协作。然而多个线程位于同一个进程内,可以访问同样的内存空间,因此存在线程之间的影响,并且申请的内存必须确保申请和释放。对于服务器系统来讲,由于它要数天、数月甚至数年连续不停的运转,一点点错误就会逐渐积累而最终导致影响服务器的正常运转,因此很难编写一个高稳定性的多线程服务器程序。微软的IIS 就是使用的多线程方式,由于微软聚集了相当多优秀程序员,所以IIS 基本上还是值得信赖的,当然我也遇到过很多系统管理员,他们根据经验定期启动所管理的NT 服务器,以预防不可预料的Web 服务停止现象。

多进程方式的优势就在于稳定性,因为一个进程退出的时候,操作系统会回收其占用的资源,从而使它不会留下任何垃圾。即便程序中出现错误,由于进程是相互隔离的,那么这个错误不会积累起来,而是随着这个进程的退出而得到清除。

预生成进程方式的性能
   由于Apache 是采用的多进程方式提供服务,为了提高性能,Apache 采用了一种特别的方式,即预生成进程模型。分析多进程方式比其他两种方式开销大的主要原因,是对每一次客户请求,都要生成一个子进程以便进行处理,因此为了避免这种开销,可以使用预先生成的进程来提供服务,并且每个进程在提供一次服务之后也不会立即退出,而是仍然保留在系统中,等待下一次请求。
   这里就可以看出,在理想情况下,预先生成的多个进程可以全速回应相应数量的浏览器客户请求,而没有额外的性能开销,因此就完全可以和线程或异步方式相媲美。然而在实际运行当中,由于预先生成的进程毕竟要占用系统资源,如系统内存和CPU 处理能力,
   这样如果预先生成的进程超过需要,性能反而会降低。因此Apache 就采用了这样的一种策略,在系统中保持一定的空闲进程,当空闲进程较少时就自动生成,当空闲进程较多时就让一些进程退出。

由于Apache 采用这样的预生成进程模型,就导致预先要生成多少进程、保留多少空闲进程、一个进程提供多少次服务等等成为与性能密切相关的问题,然而,这些设置都是与具 体条件密切相关的。例如,越多的进程需要占用越多的内存,所分得的CPU 处理时间就越少,因此系统的物理内存和CPU 处理能力就决定了进程的最大数量。而Apache 提供的基本配置是为了适应大多数情况,在客户请求较少时也不占用过多资源,因此并不是最高性能的设置。而大多数Web 服务器测试的条件下,服务器的内存、CPU 处理能力都不是问题,甚至内存大到足以将所有要访问的文档都可以放在系统缓冲中,因而无须考虑磁盘处理能力,这种情况和实际应用完全不同。因此,SGI 的一位开发者通过调整设置,并使用他自己对Apache 代码的一些改动,在同一个SGI Origin 200 服务器上使用SPECweb96 进行测试,调整后的服务器可以比原始设置提高10 倍的速度,当然这是针对SPECweb96 这个测试程序进行的调整,在实际使用中不可能会有这样巨大的差别。这至少从侧面说明了测试结果并不是绝对的。

此外,Apache 的另一个特点是它的功能特别丰富,而每种功能通常就需要进行特别的处理,这会影响Apache 的性能,然而对于具体的情况,却不是每种特性都是必要的,因此可以通过减少这些功能来增加性能。此外,操作系统的调整对于增强Apache 的性能也是非常重要的。如何根据服务器的实际情况调整操作系统以及Apache 的参数,这些内容在Apache 的文档中都有非常详细的描述。这些文档包含在每个Apache 安装文件中,也可以直接从它的主页得到。

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

Worker模式下所能同时处理的请求总数是由子进程总 数乘以ThreadsPerChild值决定的,应该大于等于MaxClients.如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进 程.默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000) 需要注意的是,如果显式声明了ServerLimit, 那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数 倍,否则Apache将会自动调节到一个相应值(可能是个非期望值).

ServerLimit  服务器允许配置的进程数上限。这个指令和ThreadLimit结合使用配置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。

ThreadLimit 每个子进程可配置的线程数上限。这个指令配置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。默认值是"64".

StartServers 服务器启动时建立的子进程数,默认值是"3"。

MinSpareThreads 最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监控空闲线程数。假如服务器中总的空闲线程数太少,子进程将产生新的空闲线程。

MaxSpareThreads 配置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监控空闲线程数。假如服 务器中总的空闲线程数太多,子进程将杀死多余的空闲线 程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正您配置的值:worker需要其大于等于 MinSpareThreads加上ThreadsPerChild的和。

MaxClients 允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候 队列。默认值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,您必须同时增加 ServerLimit的值。

ThreadsPerChild 每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。

MaxRequestsPerChild 置每个子进程在其生存期内允许伺服的最大请求数量。到达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可能无法启动,或系统将变得不稳定。


转载于:https://my.oschina.net/u/2397255/blog/599667

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值