欢迎光临
我们一直在努力

Apache:性能与稳定性-网管专栏,WEB服务

建站超值云服务器,限时71元/月

    在internet中的web服务器领域内,apache占有无可争议的领先地位。根据netcraft (http://www.netcraft.com ) 的调查,有60%的web服务器是使用的apache,当然由于这个统计是基于域名进行的,由于apache的强大功能,很多isp使用它来提供虚拟主机服务,因此如果基于ip地址来计算服务器数量,那么这个占有率会低一些,当然这不会改变apache在web领域的领先地位。

    然而,由于apache服务器为一种自由软件,它的性能及稳定性问题一直受到质疑。由于apache服务器支撑着半数的internet,对它的稳定性任何人都无法提出异议,然而,性能问题则就不那么明显可以看出来的了。因为一个网站可以拥有多个web服务器,通过负载均衡的方式来在这多个服务器之间分担负载,那么不同的服务器之间的性能差异,只要不是太明显,是不容易看出的,因此就需要使用测试软件对它们的性能进行评测。其中与微软关系密切的mindcraft(http://www.mindcraft.com)去年发布的对apache和iis的评测,结果表明,在基本的提供静态网页方面,iis的性能是apache的3.7倍,而另一个德国网站(http://www.ct.heise.de/ct/english/99/13/186-1/)使用另一个测试软件进行的评测,却得到apache的性能要超过iis的结论。为什么apache服务器在不同的评测中会得到不同的结果呢?我们必须讨论一下web服务器的实现机理。

服务器提供服务的方式

    网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务,由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。

    虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的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倍的速度(http://oss.sgi.com/projects/apache/),当然这是针对specweb96这个测试程序进行的调整,在实际使用中不可能会有这样巨大的差别。这至少从侧面说明了测试结果并不是绝对的。

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

apache 2.0展望

    虽然apache服务器使用预生成进程的方式提高了服务器的性能,然而,进程方式本身的不足仍然存在,随着访问数量的增多,进程方式比其他两种方式需要消耗更多的内存和cpu处理能力,这就限制了单台计算机提供更大负载的能力。如果在低端计算机上想服务更多的请求的话,使用异步方式的thttpd更为适合。例如,一台512mb内存双cpu的linux服务器提供1000个并发访问时,其负载就会变得相当高,常常会由于内存用光而无法运行程序,这种情况是由于linux重视物理内存,不重视交换空间的原因,如果使用同样配置的freebsd作操作系统,情况会有所改变,然而此时由于需要进行内存交换,就无法达到最优性能了。

    因此,这些情况下为了支持更改的负载,完全采用进程方式就不太合适了,而应该利用线程节约资源的优点。

    然而,在即将到来的apache 2.0中,一切都会变得更完美,apache 2.0将充分考虑到进程带来的稳定性特征,以及线程带来高效率的特点。它会预生成多个进程,而每个进程中使用多个线程提供web服务。由于存在多个进程,即使一个进程死了也不会影响整个web服务。对于不支持进程的操作系统,如windows,那么就使用多个线程提供服务,反之也是一样。然而,只有同时支持线程和进程的操作系统,才能充分利用apache 2.0带来的稳定性和高负载能力。

    事实上当前的apache并不是与线程无关,windows版本的apache是使用线程的,但按照apache文档的说法,windows版本的apache性能并不好,主要原因是它在移植过程中是使用的windows的posix子系统,而windows本身的有些特性效率更高。而在apache 2.0中,使用了apr(apache portable run-time)特性,这种特性对不同的操作系统提供了一个抽象层,以便apache能利用windows的一些非posix的特性。

    apache 2.0将是对现在的apache 1.3版本的一个飞跃,然而,当前它仍然处于alpha状态,可以预期,当apache 2.0正式推出之后,将有更多的用户接受它。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Apache:性能与稳定性-网管专栏,WEB服务
分享到: 更多 (0)