新浪網


  新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(90):單服務器性能調整
 


FreeBSD連載(90):單服務器性能調整

http://www.sina.com.cn 2000年1月31日 13:22 王波

調整服務器性能

  前面介紹了Apache服務器的基本設置選項,通過調整這些設置,就能使Web服務器達到非常優秀的性能。此 外,還可以調整操作系統的設置,包括重新定制整個系統,使之適合高負載的Web服務器。進一步,還可以利用Apache 提供的各種服務器技朮,如FastCGI、PHP等,充分發揮Web服務器的作用。

  調整Web服務器的性能,首先就要調整系統內核的性能,需要定制一個適合服務器要求的內核。此外,不要忘記使 用egcc及更大的優化選項來編譯Web服務器。

  • 單服務器性能調整

  由于Apache服務器具備高度的可配置性,因此通過調整其設置,可以極大的提升服務器的性能。對于Web 服務器,所面對的性能問題主要可以分為兩個方面,一個為Web服務器提供靜態網頁的性能,另一個為產生動態網 頁時的性能。其中在產生動態網頁時的性能下降是影響服務器性能的主要因素。

  • 使用新特性提升性能

  為了改善產生動態網頁時的性能,可以嘗試使用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或者更高。即使服務器載入了各種不同的功能模塊,產生內存 垃圾的機會就多一些,可以相應將這個值的設置降低一些。

  此外,還可以定義另一個參數MaxClients,用于設置Apache服務器可以同時擁有的最多進程數。進 程數目越多,那么占用的內存數量就越大,一旦占用的內存超過系統的物理內存,那么就必須有多余的進程被交換到交換空間 中,這樣的事情一旦發生,服務器的效率就急劇降低了。因此,即使希望服務器能同時提供較多的服務,也不能超過服務器的 物理內存限制進行設置。通常這可以通過計算進行估計,根據每個httpd守護進程占用空間的大小計算出這個數值的上限 。或者可以根據系統維護命令,如top等,觀察每個子進程占用的空間及系統內存分配情況。一般來講,Apache服務 器占用的空間并不會特別厲害,但一旦載入特別的模塊,特別是modperl,它就會使用較多的內存。

  原則上雖然可以使用物理內存來估算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設置的并發請求發生,如果系統本來 就沒有那么多的并發請求,就不必考慮增加這個設置的值,而應該使用最大并發訪問請求數來設置這個參數。

  為了確定服務器的最優設置,可以通過使用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

  先調整相應的設置,然后使用ab模擬真實情況下的連接,來測試服務器的性能,并進一步調整參數以獲得最佳的設 置。

  為了避免服務器進程在系統空閑時被無意義的殺死,可以簡單的將MinSpareServers、MaxSpa reServers和StartServers的值設置為與MaxClients的值相同。這種設置方式對于總是處于 重負載的專業Web站點的設置方式,對于業余站點,就沒有必要如此設置,這些值都可以設置得較小,以便來沒有客戶訪問 時,系統負載可以降低,留出處理能力完成其他任務。

未完,待續。。。  



 
  新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(90):單服務器性能調整


網站簡介 | 網站導航 | 廣告服務 | 中文閱讀 | 聯系方式 | 招聘信息 | 幫助信息

Copyright(C) 1999 SINA.com, Stone Rich Sight. All Rights Reserved

版權所有  四通利方 新浪網