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

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站點的設置方式,對於業余站點,就沒有必要如此設置,這些值都可以設置得較小,以便來沒有客戶訪問 時,系統負載可以降低,留出處理能力完成其他任務。