» 网友学堂 » FreeBSD教程 » FreeBSD连载(90):单服务器性能调整
FreeBSD连载(90):单服务器性能调整
作者:问天 发表时间:2007-2-15 03:08 阅读:289次 在百度搜索相关内容

前面介绍了Apache
服务器
的基本设置选项,通过调整这些设置,就能使Web
服务器
达到非常优秀的性能。此外,还可以调整操作系统的设置,包括重新定制整个系统,使之适合高负载的Web
服务器
。进一步,还可以利用Apache 提供的各种
服务器
技术,如FastCGI、PHP等,充分发挥Web
服务器
的作用。
  调整Web
服务器
的性能,首先就要调整系统内核的性能,需要定制一个适合
服务器
要求的内核。此外,不要忘记使用egcc及更大的优化选项来编译Web
服务器





服务器
性能调整

  由于Apache
服务器
具备高度的可配置性,因此通过调整其设置,可以极大的提升
服务器
的性能。对于Web
服务器
,所面对的性能问题主要可以分为两个方面,一个为Web
服务器
提供静态网页的性能,另一个为产生动态网页时的性能。其中在产生动态网页时的性能下降是影响
服务器
性能的主要因素。
[color=#FFFFFF'][/color]



使用新特性提升性能

[color=#FFFFFF'][/color]

  为了改善产生动态网页时的性能,可以尝试使用Apache能提供的新特性来帮助解决性能问题。虽然CGI和SSI 都能用于产生动态网页,但都各具缺点。CGI需要每次都要启动一个进程,因此增加了运行
服务器
的负担,而SSI功能简单,不适合大部分需要。因此为了增加
服务器
的性能,Web
服务器
的开发者考虑了各种不同的技术,以提高
服务器
提供动态网页时的运行速度。
  增加产生动态网页的性能,可以从两个角度出发,一个基于原有的CGI程序,设法使得一个CGI进程能提供多次 CGI服务,而不必每次都重新产生进程,增加
服务器
负担,基于这种考虑的解决方式的代表为FastCGI,这是由OpenMarket 公司开发了一个基于CGI的新标准,一个FastCGI程序能驻留在系统中,和Web
服务器
通信,并多次回应CGI请求,而不必重新生成进程。FastCGI程序与标准CGI程序非常类似,仅仅需要简单的修改原有的CGI 程序,就能支持FastCGI。FreeBSD下没有支持FastCGI的Port,因此要支持FastCGI就需要重新手工编译安装。
  另一个角度是从
服务器
端分析功能入手,既然SSI功能较弱,可以进一步在
服务器
内部提供更复杂的功能,PHP 就是一个代表,PHP具备丰富的数据库支持能力,因此非常流行。然而PHP却有相应的Port支持,因此可以使用 Ports Collection轻松安装PHP,同时这个Port还支持和mod_ssl相集成,可以通过选择同时集成 php3和mod_ssl。需要注意的是在安装之前仍然需要清除原有设置文件,以免带来不必要的麻烦。
  Apache-PHP3具备一个预编译好的二进制软件包,如果不想重新编译Apache,可以直接使用这个软件包。要建立一个复杂的网站,至少要使用这个预编译好的软件包,以提供高效率的动态网页支持。
  此外,由于CGI程序使用Perl编程的非常之多,因而一个非常有意义的作法为将perl解释器和Apache 集成在一起,这样在执行perl程序时就不需要重新载入Perl解释器了,这样同样也能数倍提高
服务器
的效率。支持集成perl到Apache中的模块为mod_perl,它充分发挥了perl的强大功能。在这种方式下,不但可以直接执行perl编写的CGI程序,还可以在嵌入perl语句,甚至使用perl控制Apache
服务器
的行为,包括使用perl来编写Apache的内部功能处理模块。mod_perl同样也没有Port Collection支持,需要自己下载软件重新编译Apache。
  FastCGI、PHP3和嵌入的perl只是在Apache
服务器
上最流行的几种新特性,使用它们可以非常高效的完成动态网页的生成。这些新特性对于建立一个高负载的站点是必需的。但是,也没有必要同时都提供支持,不同的使用者会喜欢使用不同的动态网页生成方式。其中PHP3的安装和设置非常简单,它又是
服务器
端分析方式,因此是在做新站点时的首选方式。而如果有大量原有的CGI程序需要继承,就可以选择FastCGI,perl的忠实拥护者则会选择modperl。


调整系统设置

  由于Apache
服务器
是采用传统的生成子进程的方式来提供服务的形式,这种形式比较适合服务比较复杂的情况,但性能却没有单进程的
服务器
高,尤其在高负载的情况下更是如此。一些使用单进程的Web
服务器
,都其声称提供静态网页的速度为Apache
服务器
的几倍,例如能通过Ports Collection安装的boa,或者另一个非常简单的
服务器
thttpd,它们提供静态网页的速度的确是Apache
服务器
无法与之相比的。当然,这些
服务器
除了因为其是单进程的服务,效率较高之外,还因为这些
服务器
没有提供复杂的特性,包括安全认证等,例如安全认证就需要Web
服务器
读取其上面各级目录的访问许可,这些额外的文件操作会明显降低
服务器
的效率。然而,由于执行CGI处理时,
服务器
都必须启动外部进程,这些简易的
服务器
就不再具备什么优势了。
  因此,如果使用者仅仅是想提供简易的静态网页服务,完全可以不必使用Apache
服务器
,单进程
服务器
性能更好,但使用者也无法利用Apache
服务器
提供的各种优秀特性了。然而,即使是使用Apache
服务器
,对提高效率也提供了很多设置参数,如果能将这些参数调整的合适,就能进一步提高
服务器
的性能,缩小与单进程
服务器
性能的差别。
  有些性能损失,如提供安全控制的特性造成的损失,只能尽量减少,而无法消除。为了减少这些特性造成的损失,对于安全控制,可以在设置文件中针对根目录指定AllowOverrider None禁止查找.htaccess文件,只对于特定需要访问控制的目录才打开访问控制功能。此外,还要设置XbitBack为Off来关闭缺省文档的SSI 功能,只使用AddHandler指令执行SSI文档。
  除了高级特性找成的性能损失之外,还有的性能损失是由于子进程服务的方式造成的,Apache
服务器
在这个方面做了很大的努力,由于使用
服务器
的用户需求多种多样,因此缺省需求并不一定最适合
服务器
,便需要调整参数设置。
  为了提升
服务器
性能,Apache
服务器
所做的一个有效的改动为使一个子进程能服务多次HTTP请求,这样就不再需要不断生成进程造成的性能损耗。但同时为了避免一个进程服务提供过多的次数的服务造成内存垃圾,Apache定义了一个MaxRequestPerChild来规定一个进程提供服务的次数,缺省设置为30。如果
服务器
提供的为静态网页,产生内存垃圾的机会就很少,可以将其设置为2000或者更高。即使
服务器
载入了各种不同的功能模块,产生内存垃圾的机会就多一些,可以相应将这个值的设置降低一些。
[color=#FFFFFF'][/color]

  此外,还可以定义另一个参数MaxClients,用于设置Apache
服务器
可以同时拥有的最多进程数。进程数目越多,那么占用的内存数量就越大,一旦占用的内存超过系统的物理内存,那么就必须有多余的进程被交换到交换空间中,这样的事情一旦发生,
服务器
的效率就急剧降低了。因此,即使希望
服务器
能同时提供较多的服务,也不能超过
服务器
的物理内存限制进行设置。通常这可以通过计算进行估计,根据每个httpd守护进程占用空间的大小计算出这个数值的上限。或者可以根据系统维护命令,如top等,观察每个子进程占用的空间及系统内存分配情况。一般来讲,Apache
服务器
占用的空间并不会特别厉害,但一旦载入特别的模块,特别是modperl,它就会使用较多的内存。
[color=#FFFFFF'][/color]

  原则上虽然可以使用物理内存来估算MaxClients的值,但是一方面还要考虑CPU的处理能力,当系统进程过多的时候,系统在进程之间切换造成的资源损失太大,就得不偿失了(top命令中的CPU利用率选项中,有一项sys 就用于标识内核占用的处理器处理时间的比率,这一个比率不应该过大)。另一方面,由于FreeBSD是合并内存和磁盘缓冲区的机制,因此应该给磁盘缓冲区留下一定的大小,毕竟Web
服务器
中磁盘I/O的性能也非常重要。
  FreeBSD中,编译时设定了最大的客户进程数为512,这是一个硬性设置,不能通过配置文件来更改的。如果想想将MaxCliets设置为大于512,就必须使用新的HARD_SERVER_LIMIT定义重新编译Apa che
服务器
。在非Ports Collection编译的Apache版本中,它的缺省设置为256。
  因此就需要综合考虑这些因素来设置MaxClients,首先要为磁盘缓冲区留下足够的空间,并以不交换到交换设备上为原则,定出一个上限值,然后根据处理器的情况进行分析。如果这个站点主要提供的是静态网页,那么对处理器的要求不大,就可以设置MaxClients为接近内存许可的上限值。如果这个站点有很多CGI程序,尤其是当这些CGI 程序需要执行繁重的处理任务时,那么系统启动过多的CGI程序,都不会迅速结束,反而不如让系统启动较少的CGI程序效率高,因此就要考虑适当降低MaxClients的设置。
  考虑Maxclients设置的前提是同时有超出现有Maxclients设置的并发请求发生,如果系统本来就没有那么多的并发请求,就不必考虑增加这个设置的值,而应该使用最大并发访问请求数来设置这个参数。
[color=#FFFFFF'][/color]

  为了确定
服务器
的最优设置,可以通过使用Apache提供的一个性能测试软件ab来进行模拟访问,这个程序缺省被安装到/usr/local/sbin中。例如使用ab向本地
服务器
的一个网页同时发起50个连接,共进行1000次连接,就执行:



bash-2.02$ /usr/local/sbin/ab -n 1000 -c 50 localhost/
This is ApacheBench, Version 1.2
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-1999 The Apache Group, http://www.apache.org/

Server Software: Apache/1.3.4
Server Hostname: localhost
Server Port: 80

Document Path: /
Document Length: 360 bytes

Concurrency Level: 50
Time taken for tests: 3.881 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 607212 bytes
HTML transferred: 360720 bytes
Requests per second: 257.67
Transfer rate: 156.46 kb/s received

Connnection Times (ms)
min avg max
Connect: 0 0 1
Processing: 26 190 1034
Total: 26 190 1035
[color=#FFFFFF'][/color]

  先调整相应的设置,然后使用ab模拟真实情况下的连接,来测试
服务器
的性能,并进一步调整参数以获得最佳的设置。
  为了避免
服务器
进程在系统空闲时被无意义的杀死,可以简单的将MinSpareServers、MaxSpa reServers和StartServers的值设置为与MaxClients的值相同。这种设置方式对于总是处于重负载的专业Web站点的设置方式,对于业余站点,就没有必要如此设置,这些值都可以设置得较小,以便来没有客户访问时,系统负载可以降低,留出处理能力完成其他任务。
未完,待续。。。

#Advertisement