今天說說Apache的優化。為什麼要優化?因為伺服器資源不夠用。資源有很多方面,但根據木桶理論,只要有一種資源不夠用,整個伺服器的性能就會受到影響(所謂瓶頸)。

 

  伺服器資源

 

  那麼伺服器的資源包括哪些?對於網站來說主要是CPU、TCP連接數這兩者。 CPU表現在任務數上,在Linux下使用平均負載(loadavg)來衡量。可通過以下命令來查看(參考這篇文章):

 

  cat /proc/loadavg

 

  對於單CPU的伺服器,loadavg高於1,表明任務佇列出現了等待,CPU忙不過來了。超過2以上就會明顯感到性能降低了。

 

  TCP連接數可通過以下命令查看:

 

  netstat -ant | grep :80 | wc -l

 

  如果要即時監控伺服器資源,可參考OpenNMS專案。

 

  注1:記憶體不算,低廉的價格使得網站伺服器很少有因為記憶體不夠而down掉的。

 

  注2:CPU%是暫態的CPU使用率,通常無法反映出整體負載。

 

  Apache配置命令

 

  Apache在資源方面的配置命令主要有以下幾條。

 

  KeepAlive 是否允許持續連接

 

  MaxKeepAliveRequests 允許的持續連接的最大數

 

  KeepAliveTimeout 持續連接在沒有請求多少秒後切斷

 

  StartServers 最初啟動時啟動多少個伺服器進程

 

  MinSpareServers 空閒伺服器進程的最小數

 

  MaxSpareServers 空閒伺服器進程的最大數

 

  MaxRequestsPerChild 每個子進程處理的最大請求數

 

  KeepAlive

 

  前三個KeepAlive相關的指令用來設置持續連接。通常都是每個HTTP請求對應一個TCP連接,但對於一個包含許多圖片的網頁來說,用戶端會在瞬間發出多個HTTP請求,此時多次建立TCP連接會大大降低回應速度。此時通過持續連接,可以允許使用者在一個TCP連接中發出多個HTTP請求,減少 TCP 連接建立次數,提高回應速度。

 

  這種情況下,應當通過access_log統計出連續HTTP請求出現的次數、間隔時間、訪問量,以確定 MaxKeepAliveRequests 和 KeepAliveTimeout 的值。 KeepAliveTimeout 太小發揮不了持續連接的作用;太大了,持續連接遲遲不斷,浪費TCP連接數不說,更糟糕的是系統中的 HTTPd 進程數目會因此不斷增加,使得系統負載升高,甚至會導致伺服器失去回應。

 

  但是在處理動態網頁請求時,由於使用者很少會瞬間請求多個動態網頁(一般都是打開頁面之後閱讀好半天才點下一頁),此時打開KeepAlive無異于浪費TCP連接數。

 

  結論就是,放動態網頁的就 KeepAlive Off 以提高輸送量,放靜態內容如圖片、js代碼等就 KeepAlive On 以減少TCP連接建立次數。來源:www.examda.com

 

  但一個Apache只能有一種 KeepAlive 設置,怎麼辦?很簡單,弄兩台伺服器,一個專門放腳本,一個專門放圖片。

 

  伺服器進程數

 

  再說說下面的 StartServers、MinSpareServers、MaxSpareServers。 StartServers基本不用修改,因為Apache會自動調節子進程數。 MinSpareServers和MaxSpareServers是空閒子進程數目,何為空閒子進程?假設某一時刻系統中共有30個HTTPd進程,其中一個是父進程,20個在處理請求,那麼空閒子進程數就是9個。

 

  空閒進程少了,大量的突發請求會使伺服器疲于進程創建,降低效率;而太多反而會增加系統進程數,增大系統負載。

 

  實際上,預設值已足夠處理一般的突發請求,所以除非是流量特別特別巨大的網站,否則不要修改這些設置。

 

  就算流量特別特別大,也是通過負載平衡系統來降低每台伺服器的訪問量,不會修改這幾個值。考試大-全國最大教育類網站(www.Examda。com)

 

  MaxRequestsPerChild

 

  這個值設置子進程在處理多少個請求之後自動結束。這個選項是用來防止進程由於記憶體洩漏等使用記憶體過多。一般預設值即可。

 

  總結

 

  說來說去其實最重要的還是 KeepAlive 的設置,而性能調節也就是調整 KeepAlive、KeepAliveTimeout 值。
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()